欧拉回路 hdu1878

来源:互联网 发布:第三方数据监测公司 mt 编辑:程序博客网 时间:2024/04/27 20:16

无向图的欧拉回路判断裸题,(不允许有孤立点)

判断条件:图是连通的,且每个点的度为偶数个。

dfs:

//#pragma warning (disable: 4786)//#pragma comment (linker, "/STACK:16777216")//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FD(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RS(s) scanf("%s", s)typedef long long LL;const int INF = 1000000007;const double eps = 1e-10;const int maxn = 1010;int n, m;int du[maxn];bool vis[maxn];vector<int>adj[maxn];int dfs(int u){    int ret = 1;    vis[u] = 1;    REP(i, adj[u].size())    {        int r = adj[u][i];        if (!vis[r]) ret += dfs(r);    }    return ret;}int main (){    int x, y;    while (cin >> n && n)    {        cin >> m;        CLR(vis, 0); CLR(du, 0);        for (int i = 0; i <= n; i++) adj[i].clear();        for (int i = 0; i < m; i++)        {            RII(x, y);            du[x]++; du[y]++;            adj[x].push_back(y);            adj[y].push_back(x);        }        int sum = 0;///记录连通分量个数(可虑和不考虑两种情况)        for (int i = 1; i <= n; i++)        {            if (!vis[i] && dfs(i) ) sum++;///题目不允许孤立点。 dfs(i)==1时允许有孤立点        }        if (sum != 1) puts("0");        else        {            int sum_old = 0;///记录奇数度的点的个数            for (int i = 1; i <= n; i++)            {                if (du[i] % 2) sum_old++;            }            if (!sum_old) puts("1");///欧拉路径改为sum_old == 0 || sum_old == 2            else puts("0");        }    }    return 0;}

并查集:

//#pragma warning (disable: 4786)//#pragma comment (linker, "/STACK:16777216")//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FD(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RS(s) scanf("%s", s)typedef long long LL;const int INF = 1000000007;const double eps = 1e-10;const int maxn = 1010;int n, m;int du[maxn];int fa[maxn];int num[maxn];void init(int n){    for (int i = 0; i <= n; i++)    {        fa[i] = i;        num[i] = 1;    }}int find(int x){    return x == fa[x] ? x : fa[x] = find(fa[x]);}int main (){    int x, y;    while (cin >> n && n)    {        cin >> m;        CLR(du, 0);        init(n);        for (int i = 0; i < m; i++)        {            RII(x, y);            du[x]++; du[y]++;            int fax = find(x);            int fay = find(y);            if (fax != fay)            {                fa[fax] = fay;                num[fay] += num[fax];            }        }        int sum = 0;///记录连通分量个数(可虑和不考虑两种情况)        for (int i = 1; i <= n; i++)        {            if (find(i) == i && num[i] ) sum++;///题目不允许孤立点。 num[i]==1时允许有孤立点        }        if (sum != 1) puts("0");        else        {            int sum_old = 0;///记录奇数度的点的个数            for (int i = 1; i <= n; i++)            {                if (du[i] % 2) sum_old++;            }            if (!sum_old) puts("1");///欧拉路径改为sum_old == 0 || sum_old == 2            else puts("0");        }    }    return 0;}


0 0
原创粉丝点击