标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 23255 | Accepted: 7977 |
Description
Input
Output
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
Source
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; bool map[3001][3001]; int num[10010]; int bin[3001]; int findx(int x) { int r = x; while(r!=bin[r]) { r = bin[r]; } int k = x,j; while(k!=r) { j = bin[k]; bin[k] = r; k = j; } return r; } void merrg(int x,int y) { int fx = findx(x); int fy = findx(y); if(fx!=fy) { bin[fx] = fy; } } int main() { int x,y; int kk = 0; while(scanf("%d%d",&x,&y)!=EOF) { int maxx = 0; kk++; int cnt = 0; int flag = 0; if(x == -1 && y == -1) { break; } if(x == 0 && y == 0) { printf("Case %d is a tree.\n",kk); continue; } for(int i=0;i<=3001;i++) { bin[i] = i; } memset(map,0,sizeof(map)); if(x!=0 && y!=0) { memset(num,0,sizeof(num)); map[x][y] = 1; merrg(x,y); if(x == y && x!=0) { flag = 1; } num[y]++; int p = max(x,y); maxx = max(maxx,p); while(scanf("%d%d",&x,&y)!=EOF) { if(x == 0 && y == 0) { break; } if((x == y && x!=0) || map[y][x] == 1) { flag = 1; } merrg(x,y); map[x][y] = 1; num[y]++; p = max(x,y); maxx = max(maxx,p); if(num[y]>1) { flag = 1; } } } if(flag == 1) { printf("Case %d is not a tree.\n",kk); } else { for(int i=0;i<=maxx;i++) { if(num[i]!=0 && bin[i] == i) { cnt++; if(cnt>1) { flag = 1; break; } } } for(int i=0;i<=maxx;i++) { for(int j=0;j<=maxx;j++) { for(int k=0;k<=maxx;k++) { if(map[j][i] == 1 && map[i][k] == 1) { map[j][k] = 1; } } } } for(int i=0;i<maxx;i++) { for(int j=0;j<=maxx;j++) { if(map[i][j]== 1 && map[j][i] == 1) { flag = 1; break; } } if(flag == 1) { break; } } if(flag == 0 && cnt == 1) { printf("Case %d is a tree.\n",kk); } else { printf("Case %d is not a tree.\n",kk); } } } return 0; }
标签:
原文地址:http://blog.csdn.net/yeguxin/article/details/43601277