Dinic代码


1.邻接表开四倍


2.在dfs下一层时,应将max_flow取当前所剩流量与容量比较。


3.bfs的能否流入取决于该边是否满流。


代码:


1
#include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "cmath" 5 #include "queue" 6 using namespace std; 7 const int maxn = 205; 8 const int inf = 0x7fffffff - 5; 9 int n ,m ,cur[maxn] ,cnt = 1 ,head[maxn] ,dis[maxn]; 10 struct node 11 { 12 int pre ,to ,c ,f ,next; 13 }e[maxn*4]; 14 15 void add(int x ,int y, int z) 16 { 17 e[++cnt].pre = x,e[cnt].to = y,e[cnt].c = z,e[cnt].next = head[x],head[x] = cnt; 18 } 19 20 bool Dinic_bfs() 21 { 22 memset(dis ,0 ,sizeof(dis)); 23 dis[1] = 1; 24 queue<int>q; 25 q.push(1); 26 int tt ,t; 27 while(!q.empty()) 28 { 29 tt = q.front(); 30 q.pop(); 31 for(int i=head[tt]; i;i=e[i].next) 32 { 33 t = e[i].to; 34 if(!dis[t]&&e[i].c>e[i].f) 35 { 36 dis[t] = dis[tt]+1; 37 q.push(t); 38 if(t == n) return true; 39 } 40 } 41 } 42 return false; 43 } 44 45 long long Dinic_dfs(long long u ,int max_flow) 46 { 47 if(u == n) return max_flow; 48 int tem = max_flow; 49 long long te = 0,ret = 0; 50 for(int i= cur[u]!=0?cur[u]:head[u]; i; i=e[i].next) 51 if(dis[e[i].to] == dis[u]+1) 52 { 53 te = Dinic_dfs(e[i].to ,min(tem ,(e[i].c - e[i].f))); 54 cur[u] = i; 55 e[i].f+=te; 56 e[i^1].f-=te; 57 ret+=te; 58 tem-=te; 59 if(tem == 0) return ret; 60 } 61 return ret; 62 } 63 64 long long Dinic() 65 { 66 long long sum = 0; 67 while(Dinic_bfs()) 68 { 69 memset(cur ,0 ,sizeof(cur)); 70 sum+=Dinic_dfs(1 ,inf); 71 } 72 return sum; 73 } 74 75 int main() 76 { 77 scanf("%d%d" ,&m, &n); 78 int x ,y ,z; 79 for(int i=1; i<=m; i++) 80 { 81 scanf("%d%d%d" ,&x ,&y ,&z); 82 add(x ,y ,z); 83 add(y ,x ,0); 84 } 85 long long ans = Dinic(); 86 cout <<ans <<endl; 87 }

 

posted @ 2017-11-25 08:51  Mnirvana  阅读(158)  评论(0编辑  收藏  举报