http://bailian.openjudge.cn/practice/4084/
这个题目要求输出时按照编号从小到大,只要把队列改成优先队列即可。
图的存储结构采用邻接表,为了方便,增加了一个记录节点入度的数组,当入度为0时,加入队列。
#include <bits/stdc++.h>
using namespace std;
#define maxV 110
vector<int> G[maxV];
int indegree[maxV];
int v, e;
bool topoSort() {
int num = 0;
priority_queue<int,vector<int>,greater<int>> q;
for (int i = 1;i <= v;i++) {
if (indegree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int u = q.top();
printf("v%d ", u);
q.pop();
int len = G[u].size();
for (int i = 0;i < len;i++) {
int v = G[u][i];
indegree[v]--;
if (indegree[v] == 0) {
q.push(v);
}
}
num++;
}
if (num == v) {
return 1;
}
else {
return 0;
}
}
int main() {
scanf("%d%d", &v, &e);
for (int i = 0;i < e;i++) {
int s, d;
scanf("%d%d", &s, &d);
indegree[d]++;
G[s].push_back(d);
}
topoSort();
return 0;
}