并查集。781MS,水过。。。
代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int set[100002], mark[100002]; 7 int flag; 8 9 int find(int a) // 查找a的根结点 10 { 11 int x=a; 12 while(set[x] != x) 13 x=set[x]; 14 return x; 15 } 16 17 void merge(int a, int b) //合并a和b都的根结点 18 { 19 int x=find(a); 20 int y=find(b); 21 if (x == y) 22 flag=0; 23 else 24 set[x]=y; 25 } 26 27 int main() 28 { 29 int n, m, i; 30 int cnt; 31 while (cin >> n >> m, n!=-1 || m!=-1) 32 { 33 if (!n && !m) 34 { 35 cout << "Yes" << endl; 36 continue; 37 } 38 flag=1; 39 cnt=0; 40 memset(mark, 0, sizeof(mark)); 41 for (i=0; i<100002; i++) 42 set[i]=i; 43 while(n || m) 44 { 45 merge(n, m); 46 mark[n]=mark[m]=1; 47 cin >> n >> m; 48 } 49 for (i=1; i<100002; i++) //查找是否有多个集合 50 { 51 if (set[i] == i && mark[i]) 52 { 53 cnt++; 54 if (cnt > 1) 55 { 56 flag=0; 57 break; 58 } 59 } 60 } 61 if (flag) cout << "Yes" << endl; 62 else cout << "No" << endl; 63 } 64 return 0; 65 }