http://acm.hdu.edu.cn/showproblem.php?pid=1285
题意:中文题求名次。
思路:裸拓扑排序。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <climits>
using namespace std;
const int MAXN = 505;
const int INF = INT_MAX;
int indegree[MAXN], N, M;
vector<int> graph[MAXN];
void Initial(){
for(int i = 0; i < MAXN; i++){
graph[i].clear();
}
memset(indegree, 0, sizeof(indegree));
}
vector<int> TuoPuSort(){
vector<int> ans;
priority_queue<int, vector<int>, greater<int> > myqueue;
for(int i = 1; i <= N; i++){
if(indegree[i] == 0) myqueue.push(i);
}
while(!myqueue.empty()){
int from = myqueue.top();
myqueue.pop();
ans.push_back(from);
for(int i = 0; i < graph[from].size(); i++){
int to = graph[from][i];
indegree[to]--;
if(indegree[to] == 0) myqueue.push(to);
}
}
return ans;
}
int main(){
// freopen("in.txt", "r", stdin);
while(~scanf("%d %d", &N, &M)){
Initial();
int x, y;
for(int i = 0; i < M; i++){
scanf("%d %d", &x, &y);
graph[x].push_back(y);
indegree[y]++;
}
vector<int> ans = TuoPuSort();
bool flag = false;
for(int i = 0; i < ans.size(); i++){
if(flag) printf(" ");
flag = true;
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}