仅作记录,拓扑模板
#include "bits/stdc++.h"
using namespace std;
const int maxN = 1e4 + 10;
vector<int> V[maxN];
vector<int> ans;
int in[maxN];
int n, x, y, m;
void topSort() {
queue<int> Q;
for (int i = 1; i <= n; ++i) {
if (!in[i]) Q.push(i);
}
while (Q.size()) {
int top = Q.front();
Q.pop();
ans.push_back(top);
for (int i = 0; i < V[top].size(); ++i) {
int xx = V[top][i];
in[xx]--;
if (!in[xx]) Q.push(xx);
}
}
if (ans.size() == n) printf("1\n");
else printf("0\n");
}
int main() {
cin >> n >> m;
while (m--) {
cin >> x >> y;
V[x].push_back(y);
in[y]++;
}
topSort();
for (int i = 0; i < ans.size(); ++i) {
cout << ans[i] << endl;
}
return 0;
}
简单优先队列版本
#include "bits/stdc++.h"
using namespace std;
const int maxN = 1e4 + 10;
vector<int> V[maxN];
vector<int> ans;
int in[maxN];
int n, x, y, m;
void topSort() {
priority_queue<int, vector<int>, less<int> > Q;
for (int i = 1; i <= n; ++i) {
if (!in[i]) Q.push(i);
}
while (Q.size()) {
int top = Q.top();
Q.pop();
ans.push_back(top);
for (int i = 0; i < V[top].size(); ++i) {
int xx = V[top][i];
in[xx]--;
if (!in[xx]) Q.push(xx);
}
}
if (ans.size() == n) printf("1\n");
else printf("0\n");
}
int main() {
cin >> n >> m;
while (m--) {
cin >> x >> y;
V[x].push_back(y);
in[y]++;
}
topSort();
for (int i = 0; i < ans.size(); ++i) {
cout << ans[i] << endl;
}
return 0;
}
|