反向建图,拓扑排序,则可以按钱递增的方式求出每一个员工的需求
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
bool visit[10005];
int head[10005];
int du[10005];
int money[10005];
struct Edge
{
int to;
int next;
}edge[20005];
int n,m;
bool topsort()
{
queue<int> q;
for(int i=1;i<=n;i++)
{
if(du[i]==0)
{
q.push(i);
money[i]=888;
}
}
int sum = n;
while(!q.empty())
{
int temp = q.front();
sum--;
q.pop();
for(int i = head[temp];i!=0;i=edge[i].next)
{
du[edge[i].to]--;
if(du[edge[i].to]==0)
{
q.push(edge[i].to);
money[edge[i].to] = money[temp]+1;
}
}
}
if(sum!=0)
return false;
else
return true;
}
int main()
{
int u,v,ans;
while(scanf("%d %d",&n,&m)!=EOF)
{
ans = 0;
for(int i = 0;i<=n;i++)
{
du[i] = 0;
head[i] = 0;
}
for(int i = 1;i<=m;i++)
{
scanf("%d %d",&u,&v);
edge[i].to = u;
edge[i].next = head[v];
head[v] = i;
du[u]++;
}
if(topsort())
{
for(int i = 1;i<=n;i++)
ans += money[i];
}
else
ans = -1;
printf("%d\n",ans);
}
return 0;
}