标签:
一道极其水的拓扑排序……但是我还是要把它发出来,原因很简单,连错12次……
题意也很裸,前面的废话不用看,直接看输入
输入n, m表示从0到n-1共n个人,有m组关系
截下来m组,每组输入a, b表示a指向b,或者b指向a也行。
输入n == 0时结束
如果可以拓扑排序,输出"YES",否则输出"NO"。每组输出占一行。
给两种代码吧,一种用邻接矩阵,另一种我也不知道叫什么好……
邻接矩阵——
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 8 const int N = 110; 9 10 int mp[N][N]; 11 int n, m; 12 int a, b; 13 int dg[N]; 14 15 int main() 16 { 17 //freopen("test.txt", "r", stdin); 18 while(~scanf("%d%d", &n, &m) && n) 19 { 20 memset(dg, 0, sizeof(dg)); 21 memset(mp, 0, sizeof(mp)); 22 for(int i = 0; i < m; i++) 23 { 24 scanf("%d%d", &a, &b); 25 if(mp[a][b] == 0 && a != b) 26 { 27 dg[b]++; 28 mp[a][b] = 1; 29 } 30 } 31 32 queue<int> que; 33 for(int i = 0; i < n; i++) 34 { 35 if(!dg[i]) que.push(i); 36 } 37 38 int sum = 0; 39 while(!que.empty()) 40 { 41 int p = que.front(); 42 que.pop(); 43 sum++; 44 dg[p]--; 45 for(int i = 0; i < n; i++) 46 { 47 if(mp[p][i]) 48 { 49 dg[i]--; 50 if(!dg[i]) 51 { 52 que.push(i); 53 } 54 } 55 56 } 57 } 58 if(sum == n) printf("YES\n"); 59 else printf("NO\n"); 60 61 } 62 return 0; 63 }
不知名——
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 8 const int N = 110; 9 10 struct Node 11 { 12 int to; 13 int next; 14 }node[N]; 15 16 int head[N]; 17 int dg[N]; 18 int n, m; 19 int a, b; 20 21 int main() 22 { 23 //freopen("test.txt", "r", stdin); 24 while(~scanf("%d%d", &n, &m) && n) 25 { 26 memset(head, -1, sizeof(head)); 27 memset(dg, 0, sizeof(dg)); 28 for(int i = 0; i < m; i++) 29 { 30 scanf("%d%d", &a, &b); 31 node[i].to = b; 32 node[i].next = head[a]; 33 head[a] = i; 34 dg[b]++; 35 } 36 37 int sum = 0; 38 queue<int>que; 39 for(int i = 0; i < n; i++) 40 { 41 if(!dg[i]) 42 { 43 que.push(i); 44 } 45 } 46 47 while(!que.empty()) 48 { 49 int p = que.front(); 50 que.pop(); 51 dg[p]--; 52 sum++; 53 for(int i = head[p]; i != -1; i = node[i].next) 54 { 55 int v = node[i].to; 56 dg[v]--; 57 if(!dg[v]) 58 { 59 que.push(v); 60 } 61 } 62 } 63 if(sum == n) printf("YES\n"); 64 else printf("NO\n"); 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/mypride/p/4480695.html