sicily 1424. 奖金

//拓扑排序
#include <iostream> //邻接表实现
#include <string.h>
#include <numeric>
using namespace std;
#define MAXN 10002
#define MAXM 20002
int in[MAXN],path[MAXN],wei[MAXN];
int u[MAXM],v[MAXM],first[MAXM],Next[MAXM];
//first[u]保存结点u的第一条边的编号,next[e]表示编号为e的边的“下一条边”的编号
int main()
{
int n,m;
cin>>n>>m;
memset(first,-1,sizeof(first)); //初始化表头
for(int e=0;e<m;++e)
{
cin>>u[e]>>v[e];
Next[e]=first[v[e]]; //有向边v[e]->u[e]
first[v[e]]=e;
in[u[e]]++;
}
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 e=first[path[i]];e!=-1;e=Next[e])
{
int x=u[e];
in[x]--;
if(in[x]==0)
path[rear++]=x;
if(wei[x]<wei[path[i]]+1) //取较大值
wei[x]=wei[path[i]]+1;
}
}
if(rear<n) //说明存在回路
cout<<"Poor Xed\n";
else
cout<<accumulate(wei+1,wei+n+1,n*100)<<endl;
return 0;
}






#include <iostream> //借助vector实现邻接表
#include <vector>
#include <string.h>
#include <numeric>
using namespace std;
#define MAXN 10002
int in[MAXN],path[MAXN],wei[MAXN];
vector<int> topo[MAXN];
int main()
{
int n,m,a,b;
cin>>n>>m;
while(m--)
{
cin>>a>>b;
topo[b].push_back(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<topo[path[i]].size();++j)
{
int x=topo[path[i]][j];
in[x]--;
if(in[x]==0)
path[rear++]=x;
if(wei[x]<wei[path[i]]+1) //取较大值
wei[x]=wei[path[i]]+1;
}
}
if(rear<n) //说明存在回路
cout<<"Poor Xed\n";
else
cout<<accumulate(wei+1,wei+n+1,n*100)<<endl;
return 0;
}

posted on 2011-07-09 03:02  sysu_mjc  阅读(240)  评论(0编辑  收藏  举报

导航