hdoj 1878 欧拉回路
欧拉回路
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10239 Accepted Submission(s):
3739
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N <
1000
)和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include<stdio.h> #include<string.h> #define MAX 1100 int set[MAX]; int path[MAX]; int find( int fa) { int t; int ch=fa; while (fa!=set[fa]) fa=set[fa]; while (ch!=fa) { t=set[ch]; set[ch]=fa; ch=t; } return fa; } void mix( int x, int y) { int fx,fy; fx=find(x); fy=find(y); if (fx!=fy) set[fx]=fy; } int main() { int n,m,j,i,s,sum,a,b,wrong; while ( scanf ( "%d" ,&n)&&n!=0) { scanf ( "%d" ,&m); memset (path,0, sizeof (path)); // memset(chu,0,sizeof(chu)); for (i=1;i<=n;i++) set[i]=i; for (i=1;i<=m;i++) { scanf ( "%d%d" ,&a,&b); path[b]++; path[a]++; mix(a,b); } sum=0;wrong=0; for (i=1;i<=n;i++) { if (set[i]==i) { sum++; if (sum>1) { wrong=1; break ; } } if (path[i]!=2) { wrong=1; break ; } } if (wrong) printf ( "0\n" ); else printf ( "1\n" ); } return 0; } |
Sample Output
1
0
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步