杭电Problem1878 欧拉回路 并查集 + 欧拉回路

来源:互联网 发布:360软件管家界面太大 编辑:程序博客网 时间:2024/05/16 09:03

问题地址

欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11814    Accepted Submission(s): 4348


Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
 

Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 

Sample Input
3 31 21 32 33 21 22 30
 

Sample Output
10
 

Author
ZJU
对于一个无向图,其为欧拉回路的充要条件为其是连通图,且顶点的度为偶数。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX_N 1005#define MIN(a, b)(a > b): a? busing namespace std;int par[MAX_N];int d[MAX_N];void init(int x){for (int i = 0; i <= x; i++) {par[i] = i;d[i] = 0;}}int find(int x){if (x == par[x])return x;elsereturn find(par[x]);}void unite(int x, int y){int fx = find(x);int fy = find(y);if (fx != fy){par[fy] = fx;}}int main(){int n, m, a, b;while (scanf("%d", &n) , n) {init(n);scanf("%d", &m);for (int i = 0; i < m; i++) {scanf("%d %d", &a, &b);unite(a, b);d[a]++;d[b]++;}int tree = 0;for (int i = 1; i <= n; i++) {if (i == par[i]) {tree++;}}if (tree != 1) {printf("0\n");continue;}for(int i = 1; i <= n; i++)         {            if(d[i] % 2 != 0)            {                tree = 0;                break;            }        }        if(tree)            printf("1\n");                else            printf("0\n");}}



0 0