题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值。



思路:好吧,这题一点思路都没有,本来题目就做的比别人少,树状DP什么的,更是少,这次要不是准备好好研究下DP问题,估计想都没想过去接触这种东西,只怪自己太懒了。题目是求最大值的,所以考虑要不要在这个点上新建圣地问题,那么就分两种情况了,所以取其中最大的值就行,由于题目给的是简单环,所以之前要进行处理下,n个顶点,n条边,所有先处理环上的树枝节点,然后再对环做DP就可以。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef long long LL;
const int MAX=100010; LL in_degree[MAX],sec[MAX],g[MAX],f[MAX],q[MAX];
LL DP[MAX][2],re[MAX][2];
bool flag[MAX];
LL n,k;
LL sum;
int i,j; LL ss(LL f,LL now,LL DP[][2],LL flag)
{
LL i,j,k;
k=now;
i=sec[k];
while(i!=f)
{
DP[i][0]+=max(DP[k][0],DP[k][1]);
DP[i][1]+=max(DP[k][0],DP[k][1]+g[k]);
k=sec[k];
i=sec[k];
}
if(flag) DP[k][1]+=g[k];
return max(DP[k][0],DP[k][1]);
}
LL solve(LL now)
{
LL i,j,xx,k;
k=now;
i=sec[k];
re[i][0]+=DP[k][0];
re[i][1]+=DP[k][0];
j=ss(now,i,re,0); DP[i][0]+=DP[k][1];
DP[i][1]+=DP[k][1]+g[k];
xx=ss(now,i,DP,1);
return max(j,xx);
}
void branch()
{
int x;
for(x=0,i=1; i<=n; i++)
{
DP[i][1]=f[i];
if(!in_degree[i])
q[x++]=i;
}
while(x)
{
k=q[--x]; flag[k]=true;
i=sec[k]; DP[i][0]+=max(DP[k][0],DP[k][1]);
DP[i][1]+=max(DP[k][0],DP[k][1]+g[k]); if(--in_degree[i]==0LL)
q[x++]=i;
}
}
LL ring()
{
memcpy(re,DP,sizeof(DP)); for(sum=0,i=1; i<=n; i++)
{
if(!flag[i])
{
sum+=solve(i);
flag[i]=true;
for(j=sec[i]; j!=i; j=sec[j])
flag[j]=true;
}
}
return sum;
} int main()
{
while(scanf("%lld",&n)!=EOF)
{
memset(in_degree,0,sizeof(in_degree));
memset(DP,0,sizeof(DP));
memset(flag,false,sizeof(flag)); for(i=1; i<=n; i++)
{
scanf("%lld%lld%lld",&f[i],&g[i],&sec[i]);
in_degree[sec[i]]++;
} branch(); //将树枝节点分离并且计算
printf("%lld\n",ring()); //另外对环上的所有点DP
}
return 0;
}

ZOJ3527的更多相关文章

随机推荐

  1. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶 ...

  2. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  3. 大神眼中的React Native--备用

    当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...

  4. tomcat服务器报Server at localhost was unable to start within 45 seconds的问题

    今天在同一个tomcat服务器下部署了2个不同的应用程序,然后启动时报错:Server at localhost was unable to start within 45 seconds.If th ...

  5. 我的VSTO之路:序

    原文:我的VSTO之路:序 VSTO是微软提供给.Net开发人员的一个接口,通过他我们可以对Office程序做一些处理.但是这个接口并不尽善尽美,相比微软的很多其他产品,VSTO的稳定性并不好,相关的 ...

  6. 分页SQL模板

    select * from ( select rownum as rn ,a.* from ( select * from page a where object_id >1000 and ow ...

  7. java学习面向对象之设计模式之单例模式

    就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ...

  8. 「Poetize8」Divisible

    描述 Description 设F[i]为斐波那契数列的第i项,F[1]=1,F[2]=1,F[i]=F[i-1]+F[i-2](i>=3). 输入格式 InputFormat 输入包含若干行( ...

  9. HDU 5452 Minimum Cut

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5452题目大意: 给你一个图G,图中包含一颗生成树.要求只能删除生成树内的一条边,使得图不联通.问最小的删除 ...

  10. 数据结构(左偏树,可并堆):BNUOJ 3943 Safe Travel

    Safe Travel Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class ...