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 }
View Code

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 }
View Code

欧拉回路或欧拉通路。

posted @ 2013-12-26 17:34  陈泽泽  阅读(239)  评论(0编辑  收藏  举报