拓扑排序。
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
int n,m;
cin >> n >> m ;
int i,a,b;
int degree[10000]={0};
vector<int> p[10000];
for (i=0;i<=m-1;i++)
{
cin >> a >> b ;
p[b-1].push_back(a-1);
degree[a-1]++;
}
int ans=0;
int now=100;
int counter=0;
while (1)
{
int flag=0;
int change[10000]={0};
if (counter==n)
break;
for (i=0;i<=n-1;i++)
if (degree[i]==0 && change[i]==0)
{
counter++;
flag=1;
ans+=now;
vector<int>::iterator iter;
for (iter=p[i].begin();iter!=p[i].end();iter++)
{
degree[*iter]--;
change[*iter]=1;
}
degree[i]=-1;
}
if (!flag)
{
cout << "Poor Xed" << endl;
return 0;
}
now++;
}
cout << ans << endl;
return 0;
}