最大流模板
来源:互联网 发布:sql时间字符串比较大小 编辑:程序博客网 时间:2024/05/12 00:31
#include<cstdio> #include<cstring> #include<queue> #include<cmath> using namespace std; const int Ni = 210; const int MAX = 1<<26; struct Edge{ int u,v,c; int next; }edge[20*Ni]; int n,m; int edn;//边数 int p[Ni];//父亲 int d[Ni]; int sp,tp;//原点,汇点 void addedge(int u,int v,int c) { edge[edn].u=u; edge[edn].v=v; edge[edn].c=c; edge[edn].next=p[u]; p[u]=edn++; edge[edn].u=v; edge[edn].v=u; edge[edn].c=0; edge[edn].next=p[v]; p[v]=edn++; } int bfs() { queue <int> q; memset(d,-1,sizeof(d)); d[sp]=0; q.push(sp); while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=p[cur];i!=-1;i=edge[i].next) { int u=edge[i].v; if(d[u]==-1 && edge[i].c>0) { d[u]=d[cur]+1; q.push(u); } } } return d[tp] != -1; } int dfs(int a,int b) { int r=0; if(a==tp)return b; for(int i=p[a];i!=-1 && r<b;i=edge[i].next) { int u=edge[i].v; if(edge[i].c>0 && d[u]==d[a]+1) { int x=min(edge[i].c,b-r); x=dfs(u,x); r+=x; edge[i].c-=x; edge[i^1].c+=x; } } if(!r)d[a]=-2; return r; } int dinic(int sp,int tp) { int total=0,t; while(bfs()) { while(t=dfs(sp,MAX)) total+=t; } return total; } int main() { int i,u,v,c; while(~scanf("%d%d",&m,&n)) { edn=0;//初始化 memset(p,-1,sizeof(p)); sp=1;tp=n; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&c); addedge(u,v,c); } printf("%d\n",dinic(sp,tp)); } return 0; }
0 0
- 最大流算法模板
- 最大流算法模板
- 最大流模板
- 最大流模板
- 最大流ISAP模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流模板
- 最大流dinic模板
- 最大流Dinic模板
- 最大流 ISAP 模板
- 最大流dinci模板
- 最大网络流 模板
- 最大流模板
- 『sklearn学习』K-means 聚类
- Uri ContentResolver ContentProvider结合使用
- 浅谈数据库主键策略
- Android开发——了解简单Android项目的结构
- TextView之你不知道的使用技巧
- 最大流模板
- Spring定时任务
- ubuntu安装cpu版caffe
- 一级指针-野指针
- Android项目Tab类型主界面大总结 Fragment+ViewPager
- myeclipse 用户登录2
- Java多态
- 串的匹配模式 蛮力匹配 KMP匹配
- 常见排序算法总结(一)