作者 唐艳琴
单位 中国人民解放军陆军工程大学
输出有向图的拓扑序列。
输入格式:
输入第一行给出两个正整数,分别表示图的节点数N(1<N≤10)、边数M(≤50)。随后的M行对应M条边,每行给出一对正整数,分别是有向边直接连通的两个节点的编号(编号从1到N依次进行)。
输出格式:
输出此图的拓扑序列,用一个空格隔开,最后也有一个空格;如果为非连通图或图中有回路,则在结尾处另起一行输出一个0。
由于拓扑序列是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表,并且保证初始入度为0的节点仅有一个。当运行过程中同时出现多个入度为0 的结点时,采用栈来保存。
输入样例1:
4 3
1 4
4 2
2 3
输出样例1:
1 4 2 3
输入样例2:
4 4
1 4
4 2
2 3
3 4
输出样例2:
1
0
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C++代码
#include <bits/stdc++.h>
using namespace std;
#define MAX_LENGTH 1010
vector<int> G[MAX_LENGTH];
int n, m, inDegree[MAX_LENGTH];
stack<int> s;
bool TopologicalOrder() {
int num = 0;
for (int i = 1; i <= n; i++) {
if (inDegree[i] == 0) {
s.push(i);
}
}
while (s.size()) {
int u = s.top();
cout << u << " ";
s.pop();
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
inDegree[v]--;
if (inDegree[v] == 0) {
s.push(v);
}
}
num++;
}
if (num == n) return true;
else return false;
}
int main() {
int x, y;
cin >> n >> m;
memset(inDegree, 0, sizeof(inDegree));
for (int i = 1; i <= m; i++) {
cin >> x >> y;
inDegree[y]++;
if(!G[x].size()) G[x].push_back(y);
else{
G[x].insert(G[x].begin(), y);
}
}
// for( vector<int>::iterator it = G[1].begin();it != G[1].end();it++) cout << *it << " ";
// cout << endl;
if (!TopologicalOrder()) {
cout << endl;
cout << "0" << endl;
}
return 0;
}