Description
由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。
【数据范围】
数据满足n<=10000,m<=20000。
Input
第一行两个整数n,m,表示员工总数和代表数,员工编号从1到n;
以下m行,每行2个整数a,b(1<=a,b<=n),表示某个代表认为第a号员工奖金应该比第b号员工高。
Output
若无法找到合法方案,则输出“Poor Xed”;否则输出一个数表示最少总奖金。
#include<iostream> #include<set> #include<vector> using namespace std; #define Max 10009 // 定义常量的时候不用加分号 set<int> s; vector<int> inc[Max]; //记录邻接点 int in[Max]; //记录每个点的入度 int salary[Max]; int main() { /* code */ int n,m; bool nocycle; cin>>n>>m; nocycle=true; s.clear(); for (int i = 0; i <= n; ++i) //又是这里的初始化问题 { /* code */ inc[i].clear(); salary[i]=100; in[i]=0; } for (int i = 0; i < m; ++i) { /* code */ int a,b; cin>>a>>b; inc[b].push_back(a); in[a]++; } for (int i = 1; i <= n; ++i) { /* code */ if(in[i]==0) { s.insert(i); } } while(!s.empty()) { int temp=*s.begin(); //cout<<temp<<" is temp"<<endl; s.erase(s.begin()); for (int i = 0; i < inc[temp].size() ; ++i) { /* code */ if(salary[inc[temp][i]]<=salary[temp]) salary[inc[temp][i]]=salary[temp]+1; in[inc[temp][i]]--; if(in[inc[temp][i]]==0) s.insert(inc[temp][i]); } } int sum=0; for (int i = 1; i <= n; ++i) { /* code */ if(in[i]!=0) { nocycle=false; break; } else sum+=salary[i]; //cout<<salary[i]<<" is "<<i<<"'s salary"<<endl; } if(nocycle) cout<<sum<<endl; else cout<<"Poor Xed"<<endl; //system("PAUSE"); return 0; }