题目链接:
http://codeforces.com/contest/412/problem/D
题目大意:
给n个人发工资,但是因为ai欠bi钱,所以要避免ai后面是bi领工资。
思路:
利用dfs,遍历每个人的后继关系(后面的人欠前面的人钱),直到一个人后继无人(好别扭。。),就把他加入答案队列中。
AC代码:
#include<cstdio>
#include<vector>
using namespace std;
const int M = 3e4 + 20;
vector<int> v[M];
int ans[M], cnt;
bool vis[M];
void dfs(int a)
{
if(vis[a])
return ;
vis[a] = true;
for(int i = 0; i < v[a].size(); i++)
dfs(v[a][i]);
ans[cnt++] = a;
}
main()
{
int n, k;
scanf("%d %d", &n, &k);
while(k--)
{
int a, b;
scanf("%d %d", &a, &b);
v[a].push_back(b);
}
for(int i = 1; i <= n; i++)
{
if(vis[i])
continue;
dfs(i);
}
for(int i = 0; i < cnt; i++)
printf("%d ", ans[i]);
}