RewardTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13511 Accepted Submission(s): 4316 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.
Input One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000)
Output For every case ,print the least money dandelion 's uncle needs to distribute .If it's impossible to fulfill all the works' demands ,print -1.
Sample Input 2 1 1 2 2 2 1 2 2 1
Sample Output 1777 -1 |
快春节了,老板打算给员工们发奖励,但是那些员工会去比较各自的奖励,并且会存在一些要求,例如,a员工的奖励要比b员工的奖励多。然而老板想要知道自己最少需要多少钱俩奖励员工。那么,老板决定每个员工的最低奖励为888元,这是个吉利的数字,现在第一行输入n跟m,n代表员工的数量,m代表有m个要求,接下来的m行就是员工的要求。每行有两个数a,b,表示a的奖励一定要比b的多。最后让你输出最低的资金。如果不能达到员工的要求及输出-1。
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int>mp[10240];
int indegree[10240];
int reword[10240];
void topo()
{
queue<int> que;
for(int i=1;i<=n;i++)
if(indegree[i]==0)
que.push(i);
int count=0;
while(!que.empty())
{
int top=que.front();
que.pop();
count++;
for(int i=0;i<mp[top].size();i++)
{
indegree[mp[top][i]]--;
if(indegree[mp[top][i]]==0)
{
que.push(mp[top][i]);
reword[mp[top][i]]=max(reword[mp[top][i]],reword[top]+1);
}
}
}
if(count!=n)
{
printf("-1\n");
return;
}
int sum=0;
for(int i=1;i<=n;i++)
sum+=reword[i]+888;
printf("%d\n",sum);
}
int main()
{
int t,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(indegree,0,sizeof(indegree));
memset(reword,0,sizeof(reword));
memset(mp,0,sizeof(mp));
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
mp[b].push_back(a);
indegree[a]++;
}
topo();
}
return 0;
}