奖金

69 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。

公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。

于是Mr.Z下令召开 m� 方会谈。

每位参加会谈的代表提出了自己的意见:“我认为员工 a� 的奖金应该比 b� 高!”

Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。

每位员工奖金最少为100元,且必须是整数。

输入格式

第一行包含整数 n,m�,�,分别表示公司内员工数以及参会代表数。

接下来 m� 行,每行 22 个整数 a,b�,�,表示某个代表认为第 a� 号员工奖金应该比第 b� 号员工高。

输出格式

若无法找到合理方案,则输出“Poor Xed”;

否则输出一个数表示最少总奖金。

数据范围

1≤n≤100001≤�≤10000,
1≤m≤200001≤�≤20000,
1≤a,b≤n1≤�,�≤�

输入样例:

2 1
1 2

输出样例:

201

分析

拓扑排序,吐了,,,,

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;

typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
    ll res=1;
    while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}
    return res;
}
const int N=202000;
int d[N],n,m,idx=0,e[N],ne[N],h[N],cnt=0,sa[N];
inline void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
queue<int> q;
bool tup(){
    while(q.size()){
        int t=q.front();
        q.pop();
        cnt++;
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            d[j]--;
            if(d[j]==0){
                q.push(j);
                sa[j]=sa[t]+1;
            }
        }
    }
    return cnt==n;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    memset(h,-1,sizeof h);
    cin>>n>>m;
    while(m--){
        int a,b;
        cin>>a>>b;
        d[a]++;
        add(b,a);
    }
    for(int i=1;i<=n;i++) sa[i]=100;
    for(int i=1;i<=n;i++){
        if(d[i]==0){
            q.push(i);
        }
    }
    ll ans=0;
    if(!tup()){
        cout<<"Poor Xed\n";
        return 0;
    }
    for(int i=1;i<=n;i++){
        ans+=sa[i];
    }
    cout<<ans<<"\n";
    return 0;
}