King's Rout
题目链接:
http://codeforces.com/gym/100792/problem/K
解题思路:
将顺序反过来,然后再求拓扑排序。注意:最后将结果倒着输出。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int n,m;
int indegree[N];
priority_queue<int> q;
vector<int> v[N];
vector<int> ans;
void solve(int cur){
int len = v[cur].size();
for(int i = 0; i < len; ++i){
int tmp = v[cur][i];
--indegree[tmp];
if(!indegree[tmp])
q.push(tmp);
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i = 0; i <= n; ++i)
v[i].clear();
ans.clear();
while(!q.empty())
q.pop();
memset(indegree,0,sizeof(indegree));
int a,b;
for(int i = 0; i < m; ++i){
scanf("%d%d",&a,&b);
++indegree[a];
v[b].push_back(a);
}
for(int i = 1; i <= n; ++i)
if(indegree[i] == 0)
q.push(i);
while(!q.empty()){
int cur = q.top();
ans.push_back(cur);
q.pop();
solve(cur);
}
for(int i = n-1; i > 0; --i)
printf("%d ",ans[i]);// 最后倒着输出。
printf("%d\n",ans[0]);
}
return 0;
}