题意:输入n个工人,m个要求。
要求a比b工钱多(老板抠门,所以每次多一块)
思路:比平常的拓扑稍微逆向一下,平常针对的是前驱,这次我们针对后驱。每个人只要有后驱,就应该比TA的后驱多一块钱。 没有后驱的工人工钱为888。我们用in数组记录后驱个数。
AC代码:
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int n;
int in[10001];
vector<int> edge[10001];
int num[10001];
queue<int> q;
int main()
{
int m,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
int cnt=0;
long long ans=0;
memset(in,0,sizeof(in));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++) edge[i].clear();
while(m--)
{
scanf("%d%d",&a,&b);
in[a]++;
edge[b].push_back(a);
}
for(int i=1;i<=n;i++) if(in[i]==0)
{
q.push(i);
num[i]=888;
}
while(!q.empty())
{
a=q.front();
cnt++;
q.pop();
for(int i=0;i<edge[a].size();i++)
{
b=edge[a][i];
num[b]=num[a]+1;
in[b]--;
if(in[b]==0) q.push(b);
}
}
for(int i=1;i<=n;i++) ans+=num[i];
if(cnt<n) printf("-1\n");
else printf("%lld\n",ans);
}
return 0;
}