hdu 3046 最小割
2016-05-21 09:45
507 查看
直接每个点和周围四个点连一条容量为1的边
s与狼连容量为inf的边
羊与t连容量为inf的边
之前以为这样会超时 还是太嫩了。。
s与狼连容量为inf的边
羊与t连容量为inf的边
之前以为这样会超时 还是太嫩了。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=500000; const int MAXM=500000; const int inf=99999999; struct edge { int v,cap,next; }edge[MAXM]; int head[MAXN],pre[MAXN],cur[MAXN],level[MAXN],gap[MAXN]; int NE; void init() { NE=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int cap) { edge[NE].v=v;edge[NE].cap=cap; edge[NE].next=head[u];head[u]=NE++; edge[NE].v=u;edge[NE].cap=0; edge[NE].next=head[v];head[v]=NE++; } int SAP(int vs,int vt,int NV) { memset(pre,-1,sizeof(pre)); memset(level,0,sizeof(level)); memset(gap,0,sizeof(gap)); for(int i=0;i<NV;i++)cur[i]=head[i]; int u=pre[vs]=vs,maxflow=0,aug=-1; gap[0]=NV; while(level[vs]<NV){ loop: for(int &i=cur[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(edge[i].cap&&level[u]==level[v]+1){ aug==-1?aug=edge[i].cap:aug=min(aug,edge[i].cap); pre[v]=u; u=v; if(v==vt){ maxflow+=aug; for(u=pre[u];v!=vs;v=u,u=pre[u]){ edge[cur[u]].cap-=aug; edge[cur[u]^1].cap+=aug; } aug=-1; } goto loop; } } int minlevel=NV; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(edge[i].cap&&minlevel>level[v]){ cur[u]=i; minlevel=level[v]; } } gap[level[u]]--; if(gap[level[u]]==0)break; level[u]=minlevel+1; gap[level[u]]++; u=pre[u]; } return maxflow; } int main() {//freopen("C:\\Users\\Administrator\\Desktop\\input.txt","r",stdin); int n,m,kase=0,tmp,vs,vt,NV,i,j; while(scanf("%d%d",&n,&m)!=EOF) { int cur=0; init(); vs=0,vt=n*m+1,NV=vt+1; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&tmp); cur++; if(i<n) add(cur,cur+m,1),add(cur+m,cur,1); if(j<m) add(cur,cur+1,1),add(cur+1,cur,1); if(tmp==2) add(vs,cur,inf),add(cur,vs,inf); else if(tmp==1) add(cur,vt,inf),add(vt,cur,inf); } printf("Case %d:\n",++kase); printf("%d\n",SAP(vs,vt,NV)); } }
相关文章推荐
- UVa 1225 Digit Counting
- Android多媒体(一)
- EXCEL如何验证重复数据?
- c#中数据库对象的介绍:dataset,dataadapter,connection,command,datareader
- 快速为PPT2003的每页加上总页码
- 线段树模板
- Spring Boot Admin Reference Guide
- VIM设置
- 正确使用pthread_create,防止内存泄漏
- Spring Boot Admin Reference Guide
- 云安全威胁
- Hibernate 入门 练习
- iOS 7 修改默认布局从status bar 底部开始
- Matlab中如何读取.dat文件
- 最长回文子串【Manacher】
- C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
- dtrace-stap-book
- django--的第一个项目hello world
- Android中intent传递对象和Bundle的用法
- draw9patch详解