HDOJ 1878 欧拉回路 nyoj 42一笔画问题
1 #include<cstdio> 2 #include<cstring> 3 int visited[1000]; 4 int find(int x) 5 { 6 if(visited[x]!=x) 7 return find(visited[x]); 8 return x; 9 } 10 void make(int a,int b) 11 { 12 int f1=find(a); 13 int f2=find(b); 14 if(f1!=f2) 15 visited[f2]=f1; 16 } 17 18 int main() 19 { 20 int a[1001]; 21 int n,m,i,j,x,y; 22 while(scanf("%d",&n)!=EOF&&n) 23 { 24 scanf("%d",&m); 25 int key=1; 26 memset(a,0,sizeof(a)); 27 28 for(i=1;i<=n;i++) 29 { 30 visited[i]=i; 31 } 32 for(i=0;i<m;i++) 33 { 34 scanf("%d %d",&x,&y); 35 make(x,y); 36 a[x]++; 37 a[y]++; 38 } 39 if(m<n-1) 40 printf("0\n"); 41 else 42 { 43 44 int root=find(1); 45 for(i=1;i<=n;i++) 46 { 47 if(a[i]%2!=0||find(i)!=root) 48 { 49 key=0; 50 break; 51 } 52 } 53 if(key) 54 printf("1\n"); 55 else 56 printf("0\n"); 57 } 58 } 59 return 0; 60 }
1、每个顶点的度为偶数。
2、每个顶点都相连。(m>=n-1)
1 #include<stdio.h> 2 #include<string.h> 3 int pa[1005]; 4 int find(int x) 5 { 6 if(x!=pa[x]) 7 pa[x]=find(pa[x]); 8 return pa[x]; 9 } 10 void un(int x,int y) 11 { 12 x=find(x); 13 y=find(y); 14 if(x!=y) 15 pa[x]=y; 16 } 17 int main() 18 { 19 int t,p,q,i,a,b,node[10001],f,sum,root; 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%d %d",&p,&q); 24 for(i=1;i<=p;i++) 25 { 26 pa[i]=i; 27 node[i]=0; 28 } 29 for(i=1;i<=q;i++) 30 { 31 scanf("%d %d",&a,&b); 32 un(a,b); 33 node[a]++; 34 node[b]++; 35 36 } 37 sum=0; 38 f=1; 39 root=find(1); 40 for(i=1;i<=p;i++) 41 { 42 if(root!=find(i)) 43 { 44 f=0; 45 break; 46 } 47 if(node[i]%2!=0) 48 sum++; 49 } 50 if(sum==2&&f==1||sum==0&&f==1) 51 printf("Yes\n"); 52 else 53 printf("No\n"); 54 } 55 return 0; 56 }
欧拉回路或欧拉通路。