拓扑排序之二
//sicily 1424. 奖金
#include<iostream> //拓扑排序
#include<vector>
using namespace std;
int n,m,a,b;
int in[10002],path[10002],add[10002];
vector<int> table[10002]; //如果是邻接矩阵则会超内存
int main()
{
cin>>n>>m;
while(m--)
{
cin>>a>>b;
table[b].push_back(a); //b->a, b指向a
in[a]++;
}
int rear=0;
for(int i=1;i<=n;++i)
if(in[i]==0)
path[rear++]=i;
for(int i=0;i<rear;++i)
{
for(int j=0;j<table[path[i]].size();++j)
{
int k=table[path[i]][j];
in[k]--;
if(in[k]==0)
path[rear++]=k;
if(add[k]<add[path[i]]+1) //取较大值
add[k]=add[path[i]]+1;
}
}
if(rear<n) //说明存在回路
cout<<"Poor Xed\n";
else
{
int s=n*100;
for(int i=1;i<=n;++i)
s+=add[i];
cout<<s<<endl;
}
return 0;
}