拓扑排序
#include <iostream>
#include <vector>
#include <queue>
#include <memory.h>
using namespace std;
const int MAXN = 10005;
int in[MAXN];
vector<int> g[MAXN];
int bonus[MAXN];
int main()
{
int n,m;
while(cin >> n >> m && n != 0)
{
for(int i = 0;i < n;i++)
g[i].clear();
memset(in,0,sizeof(in));
memset(bonus,0,sizeof(bonus));
for(int i = 0;i < m;i++)
{
int x,y;
cin >> x >> y;
g[y].push_back(x);
in[x]++;
}
queue<int> q;
int count = 0;
for(int i = 1;i <= n;i++)
{
if(in[i] == 0)
{
bonus[i] = 100;
q.push(i);
count++;
}
}
while(!q.empty())
{
int temp = q.front();
q.pop();
for(int i = 0;i < g[temp].size();i++)
{
bonus[g[temp][i]] = bonus[temp] + 1;
in[g[temp][i]]--;
if(in[g[temp][i]] == 0)
{
q.push(g[temp][i]);
count++;
}
}
}
if(count == n)
{
int add = 0;
for(int i = 1;i <= n;i++)
add += bonus[i];
cout << add << endl;
}
else
cout << "Poor Xed" << endl;
}
return 0;
}