标签:排序 ++ 题意 cstring als for 修改 注意 max
1 // 题意:输入n和m,以及m个二元组(i,j),求1~n的一个排列使得对于每个(i,j),i在j的前面 2 // 算法:拓扑排序。注意m可能等于0 3 #include<cstdio> 4 #include<cstring> 5 const int maxn = 1000; 6 int n, m, G[maxn][maxn], c[maxn], topo[maxn], t; 7 /* 8 用dfs递归到最深的一层,这层的u就是排序的最后,修改topo下标的值, 9 从后往前修改 10 */ 11 bool dfs(int u) 12 { 13 c[u] = -1;//访问标志 14 for (int v = 0; v < n; v++) 15 { 16 if (G[u][v]) 17 { 18 if (c[v] < 0) 19 return false;//存在有向环,失败 20 else if (!c[v]) 21 { 22 dfs(v); 23 } 24 } 25 } 26 c[u] = 1; 27 topo[--t] = u; 28 return true; 29 } 30 31 bool toposort() 32 { 33 t = n; 34 memset(c, 0, sizeof(c)); 35 for (int u = 0; u < n; u++) 36 { 37 if (!c[u]) 38 if (!dfs(u)) 39 return false; 40 } 41 return true; 42 } 43 44 int main() 45 { 46 while (scanf("%d%d",&n,&m)==2&&n) 47 { 48 memset(G, 0, sizeof(G)); 49 for (int i = 0; i < m; i++) 50 { 51 int u, v; 52 scanf("%d%d", &u, &v); 53 G[u - 1][v - 1] = 1; 54 55 } 56 if (toposort()) 57 { 58 for (int i = 0; i < n-1; i++) 59 printf("%d ", topo[i] + 1); 60 printf("%d\n", topo[n - 1]+1); 61 } 62 } 63 return 0; 64 }
标签:排序 ++ 题意 cstring als for 修改 注意 max
原文地址:https://www.cnblogs.com/fudanxi/p/10544945.html