HDU1878-欧拉回路的判定

来源:互联网 发布:大数据影响我们的生活 编辑:程序博客网 时间:2024/06/05 03:00

HDU1878欧拉回路

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

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
 
Source
浙大计算机研究生复试上机考试-2008年
 
思路:
判断是否是欧拉回路,可以用并查集的方法解决。用并查集建立起一个图(实质是一棵树,并且使大数结点总是指向
小数结点),在建立的过程中记录每个结点度数,满足如下两个条件的是欧拉回路:1.所有度数都是偶数。2.只有一条连
通分支(判断是否只有一个根结点即可)。然后就可以实现了。
//欧拉回路,只有一个分支。是连通图//所有点的度数都是偶数(even)#include <iostream>#include <string.h>using namespace std;int father[1010],degree[1010],n,m;inline void init(){for(int i=1; i <= n; ++i)father[i] = i;}int find(int x){if (x == father[x])return x;else return father[x] = find(father[x]);}inline void Union(int x,int y){x = find(x);y = find(y);if (x > y)father[x] = y;elsefather[y] = x;}int main(){int i,x,y;while(cin >> n && n != 0){cin >> m;init();memset(degree,0,sizeof(degree));for(i=1; i <= m; ++i){cin >> x >> y;Union(x,y);++degree[x];++degree[y];}for(i=1; i <= n; ++i){if ((degree[i]&1) || father[i] != 1)//1是根结点,如果入度为奇或者有多个分支,说明不是欧拉回路break;}if (i <= n)puts("0");else puts("1");}return 0;}


0 0
原创粉丝点击