最大权闭合子图
来源:互联网 发布:ps做淘宝宝贝详情教程 编辑:程序博客网 时间:2024/06/11 14:02
以前打过的,但是忘了,在GDKOI没想出来。
有一个有向图,点权可以为正也可以为负。选一个点集,如果点中所有的点连接的边都出现在这个点集中,那就中闭合图。如果点权和最大就是最大权闭合子图。
建图
s连向正权,负权连向t(绝对值),然后中间正常连边(如果i依赖j,那么就是i连向j)。
求解
在图中求一遍最小割,然后用正权和减去最小割就是最大权闭合子图。
证明
网络流一般都很难证明,我们感性的证一下。
如果u依赖v,所以要同时选或不选
当u为正,v为负时,假如只选了u,明显两个都要选,就是没割掉s到u的边,v到t的边,所以s到t相通,不符合最小割定义。
当u为负,v为正时,假如只选了u,明显两个都要选,就是割掉u到t的边,s到v的边,割这两条边就是s与t不连通,但是不割这两条边也不连通,但是不符合割量最小,所以不符合。
等等……
由于这些都是不属于最小割,所以要用正权和减去最小割就是最大权闭合子图。
模板题:【GDKOI2006】破解密文
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=505*505;int i,j,k,l,t,n,m,ans,a[maxn];int num,first[maxn],next[maxn],last[maxn],chang[maxn],fan[maxn];int d[maxn],data[maxn];void add(int x,int y,int z){ last[++num]=y; next[num]=first[x]; first[x]=num; chang[num]=z; fan[num]=num+1; last[++num]=x; next[num]=first[y]; first[y]=num; chang[num]=0; fan[num]=num-1;}bool bfs(){ int head=0,tail=1,now,i; memset(d,0,sizeof(d)); d[0]=1;data[1]=0; while(head<tail){ now=data[++head]; for(i=first[now];i;i=next[i]){ if(d[last[i]]==0&&chang[i]>0){ d[last[i]]=d[now]+1; data[++tail]=last[i]; } } } return (d[n+1]!=0);}int dinic(int x,int y){ int i,j=0,k; if(x==n+1){ return y; } for(i=first[x];i;i=next[i]){ if(chang[i]>0&&d[last[i]]==d[x]+1){ k=dinic(last[i],min(chang[i],y)); if(k>0){ chang[i]-=k; chang[fan[i]]+=k; y-=k;j+=k;if(y==0)break; } } } if(j==0)d[x]=-1; return j;}int main(){ scanf("%d",&n); fo(i,1,n){ scanf("%d",&a[i]); if(a[i]>0){ add(0,i,a[i]);ans+=a[i]; } else if(a[i]<0){ add(i,n+1,-a[i]); } scanf("%d",&m); fo(j,1,m){ scanf("%d",&t); add(i,t,0x7fffffff); } } while(bfs())ans-=dinic(0,0x7fffffff); printf("%d\n",ans);}
1 0
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- 最大权闭合子图
- POJ 2987 最大权闭合子图
- hdu 3996 最大权闭合子图
- hdu 3879 最大权闭合子图
- 最大权闭合子图的解法
- BZOJ 3438 最大权闭合子图
- BZOJ 1497 最大权闭合子图
- 总结:最大权闭合子图
- iOS App 的逆向工程: Hacking on Lyft
- Android之混淆心得与亲身体验
- UVa Commando War 11729 (贪心)
- 破解ios的环境和软件
- hdu 1171 Big Event in HDU 费用可行性背包 dp
- 最大权闭合子图
- EnevtBus 发布、订阅消息--android
- 局域网象棋 Java
- 解决Ubuntu下Sublime Text 3无法输入中文
- java开发时内存溢出问题
- 软件行业里常说的“架构”
- iOS下的实际网络连接状态检测
- C语言内存四区
- hdoj Harry And Physical Teacher 5066 (数学思想)