[笔记]: 网络流

来源:互联网 发布:数控车床自动编程软件 编辑:程序博客网 时间:2024/06/07 00:37

详细介绍自行百度下面是两个模板

都是poj1273模板题

1.E_K 增广路算法

//http://poj.org/status#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int N=205;const int inf=1<<29;int n,m,sum;int s,t;int cap[N][N],fa[N],flow[N][N],a[N];void E_K(){queue<int>q;while(1){memset(a,0,sizeof(a));a[s]=inf;q.push(s);while(!q.empty()){int k=q.front();q.pop();for(int i=1;i<=m;i++){if(cap[k][i]>flow[k][i]&&!a[i]){a[i]=min(a[k],cap[k][i]-flow[k][i]);fa[i]=k;q.push(i);}}}if(!a[m]) break;sum+=a[m];for(int i=m;i!=s;i=fa[i]){flow[fa[i]][i]+=a[m];flow[i][fa[i]]-=a[m];}}printf("%d\n",sum);}int main(){int u,v,w;while(scanf("%d%d",&n,&m)!=EOF){s=1;t=m;sum=0;memset(flow,0,sizeof(flow));  memset(cap,0,sizeof(cap));  while(n--){  scanf("%d%d%d",&u,&v,&w);  cap[u][v]+=w;  }  E_K();}return 0;} 

2.dinic算法 时间复杂度大大小于EK

//poj1273#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#define N 2005#define inf 1<<29using namespace std;int n,m;struct node{int to,next,w;}e[N];int cnt;int head[N],d[N];int start=1,end;void insert(int x,int y,int z){e[cnt].to=y;e[cnt].next=head[x];e[cnt].w=z;head[x]=cnt;cnt++;}queue<int>q;bool  bfs(){//bfs建图 分层q.push(start);memset(d,-1,sizeof(d));d[start]=0;while(!q.empty()){int k=q.front();q.pop();for(int i=head[k];i!=-1;i=e[i].next){int kk=e[i].to;if(d[kk]==-1&&e[i].w>0){d[kk]=d[k]+1;q.push(kk);}}}if(d[end]==-1) return 0;return 1;}int dfs(int x,int mn){if(x==end) return mn;for(int i=head[x];i!=-1;i=e[i].next){int k=e[i].to;int a=0;if(d[k]==d[x]+1&&e[i].w>0&&(a=dfs(k,min(e[i].w,mn)))){e[i].w-=a;e[i^1].w+=a;//边从0开始 去的边是0,2,4.. 回的边是1,3,5... 就是异或的结果return a;//找到就回带}}return 0;//找不到 return 0}int main(){while(scanf("%d%d",&n,&m)!=EOF){        cnt=0;        memset(head,-1,sizeof(head));start=1;end=m;int ans=0;int u,v,w;while(n--){scanf("%d%d%d",&u,&v,&w);insert(u,v,w);insert(v,u,0);//反向边 为0!!! }while(bfs()){int mn=inf;int a;while(a=dfs(start,mn))//a=0就退出ans+=a;}printf("%d\n",ans);}}


原创粉丝点击