题意:给出n个点,m条路,问能否走完m条路。
自己做的时候= =三下两下用并查集做了交,WA了一发-后来又WA了好几发--(而且也是判断了连通性的啊)
搜了题解= = 发现是这样的:
因为只要求走完所有的路,即为只需要走完已经给出的路,而并没有要求所走得路上含有所有的点,
比如说 给出的路有这些
0 1
1 2
2 3
3 0
4 4
那么构成的路即为,绕着图中的蓝色线走一圈,即为走完了所有的路,
而4是一个孤立点,也并没有构成路,所以不需要管它
代码中的 if(d[i]!=0)是判断这个点是否是孤立点的
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int d[10010],pre[10010]; 7 int find(int root){ return root == pre[root] ? root : pre[root] = find(pre[root]); } 8 void unionroot(int x,int y) 9 { 10 int root1=find(x); 11 int root2=find(y); 12 if(root1!=root2) pre[root1]=root2; 13 } 14 15 int main() 16 { 17 int m,n,u,v,i; 18 while(scanf("%d %d",&n,&m)!=EOF) 19 { 20 int flag=1; 21 memset(d,0,sizeof(d)); 22 memset(pre,0,sizeof(pre)); 23 for(i=0;i<=10010;i++) 24 pre[i]=i; 25 for(i=1;i<=m;i++) 26 { 27 scanf("%d %d",&u,&v); 28 d[u]++; 29 d[v]++; 30 unionroot(u,v); 31 } 32 33 int root=find(0); 34 35 if(m==0||n==0) flag=0;//n=0的时候是不能构成回路的,m=0的时候 也不能 36 37 for(i=0;i<n;i++){ 38 if(d[i]!=0){ //判断这个点是否是孤立的点 39 if(find(i)!=root||d[i]%2!=0){ //判断这个点是否在同一个联通块上,以及判断这个店的度数是否为偶数 40 flag=0; 41 break; 42 } 43 } 44 } 45 46 if(flag) 47 printf("Possible "); 48 else 49 printf("Not Possible "); 50 } 51 return 0; 52 }
她只是想走完所有的路,她不想走4
go---go---