题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272

方法一:

当你输入的x,y的根节点fx,fy相同时,说明已经可达,再连接就是有多余一条路径了。

迷宫应该只有一个集合,多余一个就不符合。

当直接输入00时,直接输出yes

代码:

View Code
 1 #include<stdio.h>
2 int father[100001];
3 bool visit[100001];
4 int find(int x)
5 {
6 while(x!=father[x])
7 x=father[x];
8 return x;
9 }
10
11 int main()
12 {
13 int i,x,y,min,max,flag,num,fx,fy;
14 while(scanf("%d%d",&x,&y)!=EOF)
15 {
16 flag=0;
17 min=100001;
18 max=-1;
19 if(x==-1&&y==-1)
20 break;
21 if(x==0&&y==0)
22 {
23 printf("Yes\n");
24 continue;
25 }
26
27 for(i=0;i<100001;i++)
28 {
29 father[i]=i;
30 visit[i]=0;
31 }
32 while(1)
33 {
34 if(min>x)min=x;
35 if(min>y)min=y;
36 if(max<x)max=x;
37 if(max<y)max=y;
38 fx=find(x);
39 fy=find(y);
40 visit[x]=1;
41 visit[y]=1;
42 if(fx==fy)
43 flag=-1;
44 else
45 father[fy]=fx;
46 scanf("%d%d",&x,&y);
47 if(x==0&&y==0)
48 break;
49 }
50 num=0;
51 for(i=min;i<=max;i++)
52 if(father[i]==i&&visit[i])
53 num++;
54 if(num>1)
55 flag=-1;
56 if(flag==-1)
57 printf("No\n");
58 else
59 printf("Yes\n");
60 }
61 return 0;
62 }

方法二:

根据树的性质:边数=节点数-1;

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 bool s[100001];
6 int x,y,count,num,max,min;
7 while(scanf("%d%d",&x,&y)!=EOF)
8 {
9 memset(s,0,sizeof(s));
10 if(x==-1&&y==-1)
11 break;
12 if(x==0&&y==0)
13 {
14 printf("Yes\n");
15 continue;
16 }
17 count=0;
18 max=-1;
19 min=100001;
20 while(1)
21 {
22 s[x]=1;s[y]=1;
23 if(x>max)max=x;
24 if(y>max)max=y;
25 if(x<min)min=x;
26 if(y<min)min=y;
27 count++;
28 scanf("%d%d",&x,&y);
29 if(x==0&&y==0)
30 break;
31 }
32 for(num=0;min<=max;min++)
33 if(s[min])
34 num++;
35 if(count==num-1)
36 printf("Yes\n");
37 else
38 printf("No\n");
39 }
40 return 0;
41 }

  

 posted on 2011-07-28 10:21  渲染独白  阅读(270)  评论(1编辑  收藏  举报