hdu 2647

Reward

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4093    Accepted Submission(s): 1240

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.
The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a‘s reward should more than b‘s.Dandelion‘s unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work‘s reward will be at least 888 , because it‘s a lucky number.

Input

One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000)
then m lines ,each line contains two integers a and b ,stands for a‘s reward should be more than b‘s.

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

反向建拓扑图,然后设置一个深度数组,用来记录是第几层

 1 #include<string>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<vector>
 5 #include<queue>
 6 #include<stack>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<stdlib.h>
10 #include<string>
11 #include<cmath>
12 using namespace std;
13 #define pb push_back
14 vector<int >p[10010];
15 int in[10010],n,m,deep[10010],num[10010];
16 void init(){
17     memset(in,0,sizeof(in));
18     memset(deep,0,sizeof(deep));
19     memset(num,0,sizeof(num));
20     for(int i=0;i<=n;i++) p[i].clear();
21 }
22 void tuopu(){
23     queue<int >ak_47;
24     int cnt=0;
25     for(int i=1;i<=n;i++)
26     if(in[i]==0)
27         ak_47.push(i),deep[i]=1,num[1]++;
28     while(!ak_47.empty()){
29         int pos=ak_47.front();
30         cnt++;
31         for(int i=0;i<p[pos].size();i++){
32             int to=p[pos][i];
33             if(--in[to]==0) ak_47.push(to),deep[to]=deep[pos]+1,num[deep[to] ]++;
34         }
35         ak_47.pop();
36     }
37     if(cnt<n){
38         cout<<-1<<endl;
39         return ;
40     }
41     __int64 sum=0,tmp=888;
42     for(int i=1;i<=n;i++)
43         if(num[i]) sum+=num[i]*tmp,tmp++;
44     cout<<sum<<endl;
45 }
46 int main(){
47     while(cin>>n>>m){
48         init();
49         for(int i=1;i<=m;i++){
50             int a,b;
51             scanf("%d%d",&a,&b);
52             in[a]++;
53             p[b].pb(a);
54         }
55         tuopu();
56     }
57 }

hdu 2647,布布扣,bubuko.com

时间: 2024-10-25 01:40:25

hdu 2647的相关文章

hdu 2647 Reward (拓扑排序分层)

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3815    Accepted Submission(s): 1162 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wa

HDU 2647 Reward(图论-拓扑排序)

Reward 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. The workers will compare their rewards ,a

ACM: hdu 2647 Reward -拓扑排序

hdu 2647 Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u 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

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

HDU - 2647 Reward (最短路 判环)

题目大意:有一家公司,要发奖金了.因为勤劳度不同的缘故,所以奖金不能人人都相同,问如何发奖金才能使得人人都满意,且所花费的总金额达到最小 解题思路:我将攀比关系当成了有向边,并赋为-1,如果出现负环的话,表示怎样都不可能满足的 总金额达到最小,那只要比攀比的人多1就好了,这就是赋值为-1的缘故,接着SPFA,求出来,转为正值即可 #include <cstdio> #include <cstring> #include <queue> using namespace s

HDU 2647 Reward(拓扑排序)

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. The workers will compare their rewards ,and some

HDU 2647 Reward

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9918    Accepted Submission(s): 3165 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wa

HDU 2647 Reward 拓扑排序

Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u 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

hdu 2647(拓扑排序)

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7231    Accepted Submission(s): 2263 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wa