拓扑排序之二

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

  

posted on 2011-08-22 09:14  sysu_mjc  阅读(94)  评论(0编辑  收藏  举报

导航