您的位置:首页 > 其它

poj3249【拓扑排序】

2016-04-24 22:01 204 查看
//题意: 给出一个有向无环图,每个顶点都有一个权值。

// 求一条从入度为0的顶点到出度为0的顶点的一条路径,

// 路径上所有顶点权值和最大。

//我觉得只要明白

//图论里的链式前向星 的 建图原理 和 拓扑排序的一点知识就完全有能力打出来

//以后还是可以练练手的 所以写一发吧


//拓扑排序+优化一下

//author keyboarder

//time 2016/4/23 21:52

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <algorithm>

#include <queue>

#include <math.h>

#include <queue>

#include <stack>

using namespace std;

#define INF 0x3f3f3f

#define pi acos(-1.0)

#define LL long long

#define mm 1000000007

#define N 1000010

struct asd{

int to;

int next;

};

asd q
;

int head
,tol;

int pre
;

int out
;

int val
;

int dp
;

int n,m;

void add(int a,int b)

{

q[tol].to=b;

q[tol].next=head[a];

head[a]=tol++;

}

void tuopu()

{

queue<int>e;

while(!e.empty())

e.pop();

for(int i=1;i<=n;i++)

{

if(pre[i]==0)

{

pre[i]=-1;

e.push(i);

}

}

while(!e.empty())

{

int u=e.front();

e.pop();

for(int v=head[u];v!=-1;v=q[v].next)

{

int i=q[v].to;

dp[i]=max(dp[u]+val[i],dp[i]);

pre[i]--;

if(pre[i]==0)

{

pre[i]=-1;

e.push(i);

}

}

}

}

int main()

{

while(~scanf("%d%d",&n,&m))

{

for(int i=1;i<=n;i++)

{

scanf("%d",&val[i]);

}

int u,v;

tol=0;

memset(head,-1,sizeof(head));

memset(pre,0,sizeof(pre));

memset(out,0,sizeof(out));

for(int i=0;i<m;i++)

{

scanf("%d%d",&u,&v);

add(u,v);

pre[v]++;

out[u]++;

}

for(int i=1;i<=n;i++)

{

if(pre[i]==0)

{

dp[i]=val[i];

}

else

dp[i]=-INF;

}

tuopu();

int ans=-INF;

for(int i=1;i<=n;i++)

{

if(out[i]==0)

ans=max(ans,dp[i]);

}

printf("%d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: