拓扑排序(适用于有向无环图):
1)选一个入度为0的点p输出;
2)从图中删除p点
3)将p全部后继点的入度-1
4)重复1-3,直到全部点都输出
题目:
1285 | 确定比赛名次 |
1 /* 2 需要一个存入度的数组indegree[] 3 用邻接矩阵存储图 4 Map[i][j] = 1表示有从i到j的边,及i是j的前驱结点 5 */ 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 using namespace std; 10 11 #define N 505 12 int Map[N][N],indegree[N]; 13 int n,m,cnt; 14 15 void main() 16 { 17 int i,a,b,idx; 18 while (scanf("%d%d",&n,&m)!=EOF)//n个队伍、m条数据 19 { 20 //初始化 21 memset(Map,0,sizeof(Map)); 22 memset(indegree,0,sizeof(indegree)); 23 //读取图 24 for (i=0 ; i<m ; i++) 25 { 26 cin>>a>>b; 27 if (!Map[a-1][b-1])//避免重复边 28 { 29 Map[a-1][b-1] = 1; 30 indegree[b-1]++; 31 } 32 } 33 //拓扑排序 34 cnt = 0; 35 while (cnt<n)//入栈的元素为n个表示全部排完了。 36 { 37 //找一个入度为0的点idx 38 for (idx=0 ; indegree[idx] != 0 ; idx++); 39 //避免再次统计idx点,把入度改为-1 40 indegree[idx] = -1; 41 //所有idx的后继结点入度-1 42 for (i=0;i<n;i++) 43 { 44 if (Map[idx][i] == 1) indegree[i]--; 45 } 46 cout<<idx+1<<" "; 47 cnt++; 48 } 49 cout<<endl; 50 } 51 }