题目链接 :Reward
题目大意:老板要发奖金,每次输入 a b 两人,要求 a 的奖金要比 b 的多( 反向拓扑排序。。。如果不用反向拓扑排序,有些数据无法处理
比如 :
1 2
3 2
那么 1 3 谁的奖金多无法判断。。。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct N{
int to;
int ne;
}e[10000*4+100];
int in[10000*4+10],head[10000*4+10],ans[20000];
int n,m,x,y,cnt;
void add(int u,int v)
{
e[cnt].to = v;
e[cnt].ne = head[u];
head[u] = cnt ++;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
queue<int>q;
memset(head,-1,sizeof(head));
memset(in,0,sizeof(in));
cnt = 0;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(y,x);
in[x] ++;
}
for(int i=1;i<=n;i++)
{
if(in[i] == 0)
{
q.push(i);
ans[i] = 0;
}
}
int sum = 0;
while(!q.empty())
{
int k = q.front();
q.pop();
sum ++;
for(int i=head[k];~i;i = e[i].ne)
{
in[e[i].to] --;
if(in[e[i].to] == 0)
{
q.push(e[i].to);
ans[e[i].to] = ans[k] + 1;
}
}
}
if(sum == n)
{
int an = 0;
int money = 888;
for(int i=1;i<=n;i++)
an += money + ans[i];
cout<<an<<endl;
}
else {
cout<<-1<<endl;
}
}
return 0;
}