杭电 2647 Reward(拓扑+判断有无环)

题意:输入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;
}

猜你喜欢

转载自blog.csdn.net/jack_jxnu/article/details/81514302