您的位置:首页 > 其它

pku3249 Test for Job

2010-03-22 22:44 260 查看
题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=3249

题意简述:给出一个有向无环图,每个顶点都有一个权值。求一条从入度为0的顶点到出度为0的顶点的一条路径,路径上所有顶点权值和最大。

解题思路:top+dp。在hdu的一个比赛中看到一个类似的题目,以前听队友提到过这个题目,然后比赛的时候自己写完1y。但在这改了一下后wa无敌,发现自己忽略了好多trick:统计最大值时一定只能统计出度为0的,还有刚才是初始dp的时候不能直接初始为那点的权值(具体怎么初始,就很容易了),最后一点强烈建议自己以后搞top要用链表的形式(就因为不是搞链表的形式我也wa了好多次)。

代码:

#include<stdio.h>
using namespace std;
const int Len=100005;
#define max(a,b) (a>b?a:b)
struct node{
int degr;
int numC;
int tt;
int next[150];  //开始开105时,不是re,而是wa,改成150ac。。。
}T[Len];
long long dp[Len];
bool f[Len];
bool ff[Len];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;++i)
{
T[i].numC=T[i].degr=0;
f[i]=true;   //标记初度
ff[i]=true;  //标记入度
int nt;
scanf("%d",&nt);
T[i].tt=nt;
}
for(int j=1;j<=m;++j)
{
int s,e;
scanf("%d%d",&s,&e);
T[s].next[++T[s].numC]=e;
f[s]=false;
ff[e]=false;
++T[e].degr;
}
for(int i=1;i<=n;++i)
if(ff[i]) dp[i]=T[i].tt;
else dp[i]=-2000000001;
int stack[Len];
int top;
int tnum;
tnum=0;
top=0;
for(int i=1;i<=n;++i)
if(T[i].degr==0)
{
++tnum;
stack[++top]=i;
}
while(top)
{
int temp=stack[top--];
for(int i=1;i<=T[temp].numC;++i)
{
T[T[temp].next[i]].degr--;
if(T[T[temp].next[i]].degr==0)
stack[++top]=T[temp].next[i];
dp[T[temp].next[i]]=max(dp[T[temp].next[i]],T[T[temp].next[i]].tt+dp[temp]);
}
}
long long ans=-2000000001;
for(int i=1;i<=n;++i)
if(f[i]) ans=max(dp[i],ans);
printf("%lld/n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: