HDU-3491 Thieves
来源:互联网 发布:入骨相思知不知福禄txt 编辑:程序博客网 时间:2024/05/21 11:09
最小割板子题。
原来最小割可以用最大流来写啊,,好吧应该就是用最大流。。建图有那么一点点不一样。
每个点布置的警察数,所以把每个点分成两个点来写,i到i+n的权值为 x,如果点为s或者e的话权值就为INF,然后建立一个超级源点和超级汇点,最大流跑一边就是最小割。
Sap还是没有记住啊。。TUT 抄板子。。TUT
由于vj 间歇性爆炸 ,所以不放题面了→ →。。
AC代码:
#include<bits/stdc++.h>using namespace std;const int N=11234;const int M=2000010;const int INF=0x3f3f3f3f;int n,m,source,sink;struct node{ int u,v,next; int cap;}eage[M];int head[N];int cur[N],dep[N],gap[N];int S[N];int top;int s,e;void Add(int u,int v,int w){ eage[top].u=u; eage[top].v=v; eage[top].cap=w; eage[top].next=head[u]; head[u]=top++; eage[top].u=v; eage[top].v=u; eage[top].cap=0; eage[top].next=head[v]; head[v]=top++;}void BFS(){ queue<int>q; memset(dep,-1,sizeof(dep)); memset(gap,0,sizeof(gap)); gap[0]=1; dep[sink]=0; q.push(sink); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=eage[i].next) { int v=eage[i].v; if(dep[v]==-1) { q.push(v); dep[v]=dep[u]+1; gap[dep[v]]++; } } }}int Sap(){ BFS(); memcpy(cur,head,sizeof(head)); int tot=0; int u=source; int ans=0; while(dep[source]<n) { if(u==sink) { int Min=INF; int inser; for(int i=0;i<=tot-1;i++) { if(Min>eage[S[i]].cap) { Min=eage[S[i]].cap; inser=i; } } for(int i=0;i<=tot-1;i++) { eage[S[i]].cap-=Min; eage[S[i]^1].cap+=Min; } ans+=Min; tot=inser; u=eage[S[tot]].u; } if(u!=sink&&gap[dep[u]-1]==0) break; int v; int i; for(i=cur[u];i!=-1;i=eage[i].next) { v=eage[i].v; if(eage[i].cap&&dep[v]+1==dep[u]) { break; } } if(i!=-1) { cur[u]=i; S[tot++]=i; u=v; continue; } int Min=n; for(int i=head[u];i!=-1;i=eage[i].next) { int v=eage[i].v; if(eage[i].cap&&dep[v]<Min) { Min=dep[v]; cur[u]=i; } } gap[dep[u]]--; dep[u]=Min+1; gap[dep[u]]++; if(u!=source)u=eage[S[--tot]].u; } return ans;}int main(){ int t; scanf("%d",&t); while(t--) { memset(head,-1,sizeof(head)); top=0; scanf("%d%d%d%d",&n,&m,&s,&e); source=0; sink=2*n+1; for(int i=1;i<=n;i++) { int x; scanf("%d",&x); if(i!=s&&i!=e) Add(i,i+n,x); else Add(i,i+n,INF); } for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); Add(u+n,v,INF); Add(v+n,u,INF); } Add(source,s,INF); Add(e+n,sink,INF); n=2*n+2; printf("%d\n",Sap()); } return 0;}
阅读全文
0 0
- hdu 3491 Thieves
- hdu 3491 Thieves
- hdu 3491 Thieves
- HDU-3491 Thieves
- hdu 3491 Thieves(最小割拆点)
- HDU 3491 Thieves | 最小割
- 【HDU】3491 Thieves 最小点割集
- hdu 3491 Thieves 最小割
- Thieves HDU
- HDU 3491 Thieves 【拆点+最大流】
- hdu 3491 Thieves(最小割)
- HDU 3491 Thieves 拆点 最小割
- Thieves (hdu 3491 拆点 最小割)
- HDU 3491 Thieves(经典拆点建图,割点)
- HDU 3491 Thieves 最小点割集+拆点==最大流(建图可贵)
- 【网络流】 HDOJ 3491 Thieves
- hdoj 3491 Thieves 【最小割点集】
- hdoj--3491--Thieves(最小割点集)
- 再也不用担心javascript的this---从代码去理解(第一篇)---深析this原理
- c#中FileStream一些常用的属性和和方法
- 机器学习实战代码详解(九)树回归
- Linux 内核超时导致虚拟机无法正常启动
- ehcache-01 : 使用spring cache和ehcache之前必须了解的
- HDU-3491 Thieves
- python处理json
- MyEclipse将Java项目打包成jar文件的三种方法
- Java反射的学习
- 数理统计中常用函数、概率分布函数总结
- Spring Web MVC
- 禁止images图片拖拽
- 解决Idea 出现 "Could not autowire.." 错误
- Android Sensor详解(7)sensor framework层详解第二篇