描述:
对输入的有向图进行拓扑排序,并输出一个拓扑有序序列;如果存在有向环,则输出"Network has a cycle!"
输入:
顶点数 n 边数 m
u v (从u到v的一条有向边)
......
最后一行以0 0 结束
输出:
拓扑有序序列
————————————————————集训6.1的分割线————————————————————
代码如下:
/*
ID: j.sure.1
PROG:
LANG: C++
*/
/****************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
/****************************************/
const int N = 50, M = N*N;
struct Node
{
int u, v, next;
}edge[M];
int head[N], tot, n, m, indeg[N];
vector <int> ans;
stack <int> s;
void init()
{
memset(head, -1, sizeof(head));
memset(indeg, 0, sizeof(indeg));
tot = 0;
}
void add(int u, int v)
{
indeg[v]++;
edge[tot].u = u;
edge[tot].v = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void Topsort()
{
for(int i = 0; i < n; i++) {
if(indeg[i] == 0) {
s.push(i);
//ans.push_back(i);
}
}
while(!s.empty()) {
int cur = s.top();
s.pop();
ans.push_back(cur);
for(int i = head[cur]; i != -1; i = edge[i].next) {
int k = edge[i].v;
indeg[k]--;
if(!indeg[k]) s.push(k);
}
}
if(ans.size() != n)
puts("Network has a cycle");
else {
for(int i = 0; i < n-1; i++) {
printf("%d ", ans[i]+1);
}
printf("%d\n", ans[n-1]+1);
}
}
int main()
{
#ifdef J_Sure
freopen("stack.in", "r", stdin);
//freopen(".out", "w", stdout);
#endif
while(scanf("%d%d", &n, &m)!=EOF&&n+m) {
init();
int u, v;
for(int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
u--; v--;
add(u, v);
}
Topsort();
}
return 0;
}