4040 EZ系列之奖金 (拓扑)

4040 EZ系列之奖金

 

时间限制: 1 s
空间限制: 64000 KB
题目等级 : 钻石 Diamond
 
 
 
 
题目描述 Description

由于无敌的WRN在2015年世界英俊帅气男总决选中胜出,EZ总经理Mr.Lin心情好,决定给每位员工发奖金。EZ决定以每个人本年在EZ的贡献为标准来计算他们得到奖金的多少。

于是Mr.Lin下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为学生a的奖金应该比b高!”Mr.Lin决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位学生奖金最少为100元。

输入描述 Input Description

第一行两个整数n,m,表示学生总数和代表数;

以下m行,每行2个整数a,b,表示某个代表认为第a号学生奖金应该比第b号学生高。

输出描述 Output Description

若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。

样例输入 Sample Input

2 1

1 2

样例输出 Sample Output

201

数据范围及提示 Data Size & Hint

80%的数据满足n<=1000,m<=2000

100%的数据满足n<=10000,m<=20000

 1 #include<iostream>
 2 using namespace std;
 3 #define N 10010
 4 int ru[N];  //记录入度 
 5 int tmp[N][N];  
 6 int stack[N];  
 7 int sum,k,c,n,m;
 8 bool tuopu()
 9 {
10     while(c<n)
11     {
12         m=0;
13         for(int i=1;i<=n;++i)
14             if(ru[i]==0)
15             {
16                 ++m;
17                 ++c;
18                 sum+=100;
19                 stack[m]=i;
20                 ru[i]=0xfffffff;
21             }
22         if(m==0)return false;
23         sum+=(k*m);
24         k++;
25         for(int i=1;i<=m;++i)
26         {
27             int d=stack[i];
28             for(int j=1;j<=tmp[d][0];++j)
29             ru[tmp[d][j]]--;
30         }
31     }
32     return true;    
33 }
34 int main()
35 {
36     cin>>n>>m;
37     for(int x,y,i=1;i<=m;++i)
38     {
39         cin>>x>>y;
40         tmp[y][++tmp[y][0]]=x;
41         ru[x]++;
42     }
43     if(tuopu())cout<<sum;
44     else cout<<"-1";
45     return 0;
46 }
原文地址:https://www.cnblogs.com/mjtcn/p/6709887.html