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