1. 程式人生 > 其它 >1352:【例4-13】獎金

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;
}