描述
由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。
输入
第一行两个整数n,m,表示员工总数和代表数;
以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。
输出
若无法找到合理方案,则输出“Poor Xed”;否则输出一个数表示最少总奖金。
样例输入
2 1
1 2
样例输出
201
提示
【数据规模】
80%的数据满足:n≤1000,m≤2000;
100%的数据满足:n≤10000,m≤20000。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[10001][301],into[10001],ans[10001],m,n,money; 4 void init() 5 { 6 int i,x,y; 7 cin>>n>>m; 8 for(int i=1;i<=m;i++) 9 { 10 cin>>x>>y; 11 a[y][0]++; //由y引出边的数目 12 a[y][a[y][0]] = x; //由ay0引出边的顶点 13 into[x]++; //x的入度+1 14 } 15 } 16 bool topsort() 17 { 18 int t,tot,k,i,j; 19 tot = 0;k = 0; 20 while(tot<n) //当顶点个数没满n 21 { 22 t = 0; //用来判断有无环 23 for(int i=1;i<=n;i++) 24 if(into[i]==0) // 将入度0的点入栈 25 { 26 tot++;t++;money+=100; 27 ans[t] = i; 28 into[i] = 0xffffff; //设第i个点的入度为无限大,避免再次入栈 29 } 30 if(t==0)return 0;//存在环 31 money+=k*t;k++; //最少要准备的钱 32 for(i=1;i<=t;i++) //去掉相连的边,或者说去掉之前入度为0入栈的点 33 { 34 for(j=1;j<=a[ans[i]][0];j++) //要遍历第ans[i]个点的相连点的入度-1 35 { 36 into[a[ans[i]][j]]--; 37 } 38 } 39 } 40 return 1; 41 } 42 int main() 43 { 44 init(); 45 money = 0; 46 if(topsort())cout<<money; 47 else cout<<"Poor Xed"; 48 return 0; 49 }
标签:10001,int,拓扑,tot,员工,奖金,5795,Mr,TZOJ From: https://www.cnblogs.com/jyssh/p/17219520.html