1352:【例4-13】奖金

奖金

来道拓扑排序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N=1e4+5;
vector<int> vec[N];
int in[N];//存储入度
int pay[N];
bool solve(int n){
    int cnt=0,inc=0;
    queue<int> q;//存储目前入度为0的节点
    bool vis[N];
    memset(vis,0,sizeof(vis));
    while(1){
        for(int i=1;i<=n;i++){
            if(!in[i]&&!vis[i])q.push(i);
        }
        if(q.empty())break;
        while(!q.empty()){
            int t=q.front();
            pay[t]+=inc;
            q.pop();
            cnt++;
            vis[t]=1;
            for(int i=0;i<vec[t].size();i++)
                in[vec[t][i]]--;
        }
        inc++;
    }
    return cnt==n;//若cnt<n,说明图中有环
}
int main(){
    int n,m;
    cin>>n>>m;
    int a,b;
    while(m--){
        scanf("%d%d",&a,&b);
        in[a]++;
        vec[b].push_back(a);
    }
    if(solve(n)){
        int sum=0;
        for(int i=1;i<=n;i++)sum+=pay[i];
        printf("%d",100*n+sum);
    }else{
        cout<<"Poor Xed";
    }
    return 0;
}
posted @ 2021-10-31 13:47  Rekord  阅读(347)  评论(0编辑  收藏  举报