POJ 1273 && 3469 【最大流】
来源:互联网 发布:淘宝新开店铺采集 编辑:程序博客网 时间:2024/05/22 10:46
1273
裸最大流
【史上最优模版】
/* ***********************************************Author :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k) memset(a,k,sizeof(a))#define LL long long#define N 1005#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}const int MAXN=210;const int MAXM=410;const int INF=0x3f3f3f3f;struct Node{ int to,next,cap;}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];void init(){ tol=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw=0) //单向边的话不用管rw{ edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++; edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++;}int sap(int start,int End,int nodenum) //源点、汇点、点的个数{ memset(dis,0,sizeof(dis)); memset(gap,0,sizeof(gap)); memcpy(cur,head,sizeof(head)); int u=pre[start]=start,maxflow=0,aug=-1; gap[0]=nodenum; while(dis[start]<nodenum) { loop: for(int &i=cur[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&dis[u]==dis[v]+1) { if(aug==-1||aug>edge[i].cap) aug=edge[i].cap; pre[v]=u; u=v; if(v==End) { maxflow+=aug; for(u=pre[u];v!=start;v=u,u=pre[u]) { edge[cur[u]].cap-=aug; edge[cur[u]^1].cap+=aug; } aug=-1; } goto loop; } } int mindis=nodenum; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&mindis>dis[v]) { cur[u]=i; mindis=dis[v]; } } if((--gap[dis[u]])==0)break; gap[dis[u]=mindis+1]++; u=pre[u]; } return maxflow;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,m,u,v,w; while(~scann(n,m)) { init(); REP(i,0,n) { scann(u,v); scan(w); addedge(u,v,w); } printf("%d\n",sap(1,m,m)); } return 0;}
3469
转化为最大流
先找两个没出现的点s,t 作为源点和汇点
连n条 <s,i>的边
n条<i,t>的边
m*2条<a , b>,<b , a>边
既是求s,t的最大流
【模版大法好】
/* ***********************************************Author :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k) memset(a,k,sizeof(a))#define LL long long#define N 1005#define mod 1000000007inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}const int MAXN=20010;const int MAXM=2000005;const int INF=0x3f3f3f3f;struct Node{ int to,next,cap;}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];void init(){ tol=0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int w,int rw=0) //单向边的话不用管rw{ edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++; edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++;}int sap(int start,int End,int nodenum) //源点、汇点、点的个数{ memset(dis,0,sizeof(dis)); memset(gap,0,sizeof(gap)); memcpy(cur,head,sizeof(head)); int u=pre[start]=start,maxflow=0,aug=-1; gap[0]=nodenum; while(dis[start]<nodenum) { loop: for(int &i=cur[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&dis[u]==dis[v]+1) { if(aug==-1||aug>edge[i].cap) aug=edge[i].cap; pre[v]=u; u=v; if(v==End) { maxflow+=aug; for(u=pre[u];v!=start;v=u,u=pre[u]) { edge[cur[u]].cap-=aug; edge[cur[u]^1].cap+=aug; } aug=-1; } goto loop; } } int mindis=nodenum; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(edge[i].cap&&mindis>dis[v]) { cur[u]=i; mindis=dis[v]; } } if((--gap[dis[u]])==0)break; gap[dis[u]=mindis+1]++; u=pre[u]; } return maxflow;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,m,u,v,w; while(~scann(n,m)) { int s = n + 1, t = n + 2; init(); REPP(i,1,n) { scann(u,v); addedge(s,i,u); addedge(i,t,v); } REPP(i,1,m) { scann(u,v); scan(w); addedge(u,v,w); addedge(v,u,w); } printf("%d\n",sap(s,t,n+2)); } return 0;}
0 0
- POJ 1273 && 3469 【最大流】
- POJ 3469 最大流
- POJ 1273 最大流
- 最大流 POJ 1273
- poj 1273 最大流问题
- poj 1273 EK 最大流
- POJ 1273 最大流问题
- POJ 1273 最大流 Dinic
- poj 1273 网络最大流
- 网络流之最大流 POJ 1273
- POJ 1273 网络流最大流 题解
- poj 3469(最大流最小割)
- POJ 3469 最小割 最大流
- poj 3469 最大流 最小割
- POJ 3469 —— 最大流
- poj 3469 Dual Core CPU (最大流)
- poj 1273 Drainage Ditches 网络最大流
- POJ-1273 朴素的最大流
- Github团队协作教程
- java 求最长回文子串
- Sublime Text 3 3126 注册码
- 关于SQL漏洞--不用statement的原因
- NLP:stanfordNLP
- POJ 1273 && 3469 【最大流】
- 敏捷开发学习总结(1):传统序列式软件开发方法的缺点,以及迭代开发方法的选择
- Linux 命令字 ls
- n个数中任意两个异或最大值
- background-origin 学习
- R语言在ubuntu下的编译安装
- HDU 4638Group 树状数组离线
- Redis之(四)事务
- spring