Ordering Tasks
UVA – 10305 下面的代码也是这道题的题解:
#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;
#define Maxn 110
int dge[Maxn],G[Maxn][Maxn]; // 分别为 一个顶点的入度,和一个邻接图G
int main(void)
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n,m;
while(cin >> n >> m) {
if(n == 0 && m == 0) break;
memset(dge,0,sizeof(dge));
memset(G,0,sizeof(G));
int tmp,tp;
for(int i = 1 ; i <= m ; ++i) {
cin >> tmp >> tp;
G[tmp][tp] = 1; // tmp->tp 标记为 1
dge[tp]++; // tp的入度 + 1
}
queue<int> qu;
// 把入度为 0 的顶点放进 队列中
for(int i = 1 ; i <= n ; ++i) if(!dge[i]) qu.push(i);
while(!qu.empty()) {
int v = qu.front();
qu.pop();
// 一个一个地弹出入度为 0 的顶点
cout << v;
// 判断这个顶点有没有与其他顶点有边,如果有,则这个顶点的入度 - 1
// 如果入度 为 0 ,则把这个顶底继续放进队列中,直到队列为空
for(int i = 1 ; i <= n ; ++i) if(G[v][i]) { dge[i]--; if(!dge[i]) qu.push(i); }
if(!qu.empty()) cout << " "; else cout << endl;
}
//如果队列为空,仍有顶点入度不为0,则说明有环
}
return 0;
}