3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
1 0
什么是欧拉回路?
这个我起初以为很简单,就是一个环而已,所以每个顶点只要出现偶数次(至少是2次,不能是0次),就说明有环。
#include <stdio.h> #include <string.h> int du[1000]; int main() { int n, m; int u, v; int i; while(scanf("%d", &n) && n != 0) { memset(du, 0, sizeof(du)); scanf("%d", &m); while(m--) { scanf("%d %d", &u, &v); du[u]++; du[v]++; } int flag = 1; for(i = 1; i <= n; i++) { if(du[i]&1){ flag = 0; break; } } printf("%d\n",flag); } return 0; }
/**************************************************************
Problem: 1027
User: 从此醉
Language: C
Result: Accepted
Time:60 ms
Memory:908 kb
****************************************************************/
太简单了吧? 在九度OJ是可以过的,只能说明这个OJ太弱了。
换到HDU就不行了。因为没有考虑到 独立环 这种情况。题目要求是:每天边都要遍历,而且只能有一次。
所以,符合下面两点就行了:
1、可以用并查集,来检测是不是所有点都在一个集合里。
2、每个点 上的边是偶数。因为,如果 (1)这个点是起点,肯定有一条边出,一条边进,2条边。如果(2)这个点不是起点,肯定是有进必有出,即偶数!
#include <stdio.h> int arr[1000]; int father[1000]; int rand_deep[1000]; int findSet(int x){ int px = x,i; while(px != father[px]) px = father[px]; //路径压缩,加快查找速度 while(x != px){ i = father[x]; father[x] = px; x = i; } return px; } void unionSet(int x,int y){ x = findSet(x); y = findSet(y); if(rand_deep[x] > rand_deep[y]) father[y] = x; else{ father[x] = y; if(rand_deep[x]==rand_deep[y])rand_deep[y]++; } } int main() { int N,M; while( scanf("%d",&N) != EOF && N){ scanf("%d",&M); int i; int flag = 1; for(i=1; i<=N; i++){ father[i] = i; rand_deep[i] = 0; arr[i] = 0; } for(i=0; i<M; i++){ int x,y; scanf("%d %d",&x, &y); arr[x] ++; arr[y] ++; unionSet(x , y); } int father; for(i=1; i<=N; i++){ if(i==1) father = findSet(1); else{ if(father!=findSet(i)){ flag = 0; break; } } if(arr[i] == 0 || arr[i]%2 != 0){ flag = 0; break; } } printf("%d\n",flag); } return 0; }