【題目描述】由於無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,Yali Company總經理Mr.Z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的貢獻爲標準來計算他們得到獎金的多少。 於是Mr.Z下令召開m方會談。每位參加會談的代表提出了自己的意見:“我認爲員工a的獎金應該比b高!”Mr.Z決定要找出一種獎金方案,滿足各位代表的意見,且同時使得總獎金數最少。每位員工獎金最少爲100元。 【輸入】第一行兩個整數n,m,表示員工總數和代表數; 以下m行,每行2個整數a,b,表示某個代表認爲第a號員工獎金應該比第b號員工高。 【輸出】若無法找到合理方案,則輸出“Poor Xed”;否則輸出一個數表示最少總獎金。 【輸入樣例】
【輸出樣例】
【提示】【數據規模】 80%的數據滿足:n≤1000,m≤2000; 100%的數據滿足:n≤10000,m≤20000。 |
#include <bits/stdc++.h>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(scanf("%d",&a)!=EOF)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
using namespace std;
typedef long long ll;
const int idata=1e4+5;
int n,m,t,f;
int i,j,k;
int into[idata];
int salary[idata];
int cnt;
vector<int> v[idata];
queue<int> q;
bool topsort()
{
for(i=1;i<=n;i++){
if(into[i]==0){
q.push(i);
}
}
while(!q.empty()){
int u=q.front();q.pop();
++cnt;
for(i=0;i<v[u].size();i++){
if(--into[v[u][i]]==0){
q.push(v[u][i]);
}
salary[v[u][i]]=max(salary[u]+1,salary[v[u][i]]);
}
}
if(n==cnt) return true;
else return false;
}
int main()
{
cin.tie(0);
iostream::sync_with_stdio(false);
while(cin>>n>>m)
{
for(i=1;i<=n;i++){
salary[i]=100;
}
for(i=0;i<m;i++){
int a,b;
cin>>a>>b;
into[a]++;
v[b].push_back(a);//a比b高,b是a的基
}
int tot=0;
if(topsort()){
for(i=1;i<=n;i++){
tot+=salary[i];
}
cout<<tot<<endl;
}
else
cout<<"Poor Xed"<<endl;
}
return 0;
}