A - 欧拉回路
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
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
Sample Output
1 0
1 #include <cstdio> 2 #include <cstring> 3 #define maxn 1001 4 #define inf 0x3f3f3f3f 5 int pre[maxn],b[maxn]; 6 int find(int x) 7 { 8 return x==pre[x]?x:find(pre[x]); 9 } 10 void merge(int x,int y) 11 { 12 int tx=find(x); 13 int ty=find(y); 14 if(tx!=ty) 15 { 16 pre[ty]=tx; 17 } 18 } 19 int main() 20 { 21 int n,m; 22 while(~scanf("%d",&n)&&n) 23 { 24 memset(b,0,sizeof(b)); 25 for(int i=1;i<=n;i++) pre[i]=i; 26 scanf("%d",&m); 27 for(int i=1;i<=m;i++) 28 { 29 int u,v; 30 scanf("%d%d",&u,&v); 31 b[u]++; 32 b[v]++; 33 merge(u,v); 34 } 35 int f=0,f1=0; 36 for(int i=1;i<=n;i++) 37 { 38 if(pre[i]==i) f1++; 39 if(b[i]%2) f++;//存在奇度点,说明是欧拉通路 40 } 41 if(f1==1&&f==0) 42 printf("1\n"); 43 else 44 printf("0\n"); 45 } 46 }
浙公网安备 33010602011771号