【网络流#3】hdu 1532 - Dinic模板题

输入为m,n表示m条边,n个结点

记下来m行,每行三个数,x,y,c表示x到y的边流量最大为c

这道题的模板来自于网络

http://blog.csdn.net/sprintfwater/article/details/7913061

建议大家去这个页面看看,博主也很良心地添加了很多注释

关于这个模板:
Edge为前向星的边数,所以需要初始化Edge和head数组
n表示有n个点,这个版无所谓点从0开始还是从1开始,s表示源点,t表示汇点
很好的一个是,这个版的DFS使用的是模拟栈,防止爆栈

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<stack>
  9 #include<vector>
 10 #include<queue>
 11 #include<string>
 12 #include<sstream>
 13 #define MAXN 200
 14 #define MAXM 400
 15 #define INF (1<<30)
 16 #define eps 0.000001
 17 #define ALL(x) x.begin(),x.end()
 18 #define INS(x) inserter(x,x.begin())
 19 using namespace std;
 20 int i,j,k,n,m,x,y,T,num,w;
 21
 22 const int inf = 0x3f3f3f3f;
 23 struct edgenode
 24 {
 25     int from,to,next;
 26     int cap;
 27 }edge[MAXM];
 28 int Edge,head[MAXN],ps[MAXN],dep[MAXN];
 29
 30 void addedge(int x,int y,int c)
 31 {
 32     edge[Edge].from=x;
 33     edge[Edge].to=y;
 34     edge[Edge].cap=c;
 35     edge[Edge].next=head[x];
 36     head[x]=Edge++;
 37
 38     edge[Edge].from=y;
 39     edge[Edge].to=x;
 40     edge[Edge].cap=0;
 41     edge[Edge].next=head[y];
 42     head[y]=Edge++;
 43 }
 44
 45 int dinic(int n,int s,int t)
 46 {
 47     int tr,flow=0;
 48     int i,j,k,l,r,top;
 49     while(1){
 50         memset(dep,-1,(n+1)*sizeof(int));
 51         for(l=dep[ps[0]=s]=0,r=1;l!=r;)//BFS部分,将给定图分层
 52         {
 53             for(i=ps[l++],j=head[i];j!=-1;j=edge[j].next)
 54             {
 55                 if (edge[j].cap&&-1==dep[k=edge[j].to])
 56                 {
 57                     dep[k]=dep[i]+1;ps[r++]=k;
 58                     if(k==t)
 59                     {
 60                         l=r;
 61                         break;
 62                     }
 63                 }
 64             }
 65         }
 66         if(dep[t]==-1)break;
 67
 68         for(i=s,top=0;;)//DFS部分
 69         {
 70             if(i==t)//当前点就是汇点时
 71             {
 72                 for(k=0,tr=inf;k<top;++k)
 73                     if(edge[ps[k]].cap<tr)tr=edge[ps[l=k]].cap;
 74
 75                 for(k=0;k<top;++k)
 76                     edge[ps[k]].cap-=tr,edge[ps[k]^1].cap+=tr;
 77
 78                 flow+=tr;
 79                 i=edge[ps[top=l]].from;
 80             }
 81
 82             for(j=head[i];j!=-1;j=edge[j].next)//找当前点所指向的点
 83                 if(edge[j].cap&&dep[i]+1==dep[edge[j].to]) break;
 84
 85             if(j!=-1)
 86             {
 87                 ps[top++]=j;//当前点有所指向的点,把这个点加入栈中
 88                 i=edge[j].to;
 89             }
 90             else
 91             {
 92                 if (!top) break;//当前点没有指向的点,回溯
 93                 dep[i]=-1;
 94                 i=edge[ps[--top]].from;
 95             }
 96         }
 97     }
 98     return flow;
 99 }
100
101 int main()
102 {
103     int T,cas,m,s,t,n,maxflow,i;
104     int x,y,c;
105     double ans;
106     while(~scanf("%d%d",&m,&n))
107     {
108         memset(head,-1,sizeof(head));
109         Edge=0;
110         for(i=0;i<m;i++)
111         {
112             scanf("%d%d%d",&x,&y,&c);
113             addedge(x,y,c);
114         }
115         printf("%d\n",dinic(n,1,n));
116     }
117     return 0;
118 }

时间: 2024-09-30 14:16:50

【网络流#3】hdu 1532 - Dinic模板题的相关文章

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

hdu 1711 KMP模板题

// hdu 1711 KMP模板题 // 贴个KMP模板吧~~~ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAX_N = 1000008; const int MAX_M = 10008; int T[MAX_N]; int p[MAX_M]; int f[MAX_M]; int

hdu 2586 LCA模板题(离线算法)

http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B&quo

HDU 2586 LCA模板题

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 设dist[i]为i到根0的链和,求法(Dfs过程中dist[v]=dist[u]+e[i].w) 对于树中任意两点形成的链,可以通过LCA最近公共祖先剖分. 比如2->3,就可以经过LCA点1:  2->1->3 链和=dist[u]+dist[v]-2*dist[LCA[u,v]] (

hdu 2544 hdu 1874 Dijkstra 模板题

hdu 2544  求点1到点n的最短路 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long

HDU 2087 kmp模板题

s为主串 t为模板串 求t的nextt 加const #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; char s[1005]; char t[1005]; int nextt[1005]; void makenext(const ch

hdu 1423 GCIS 模板题

//GCIS 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 int dp[510], Max; 7 int s1[510], s2[510]; 8 int len1, len2; 9 10 int main() 11 { 12 int T, i, j;

hdu 3342 拓扑模板题

直接上代码吧 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int m,n,map[110][110],degree[110]; int topo() { int i,j,k,mark; for(i=0;i<m;i++) { mark=0; for(j=0;j<m;j++) { if(degree[j]==0) { mark=1; degree[j]=-

HDU 1402 fft 模板题

题目就是求一个大数的乘法 这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行 我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 + 3*x^0 (在这里x可以理解成10) 那么两个数字相乘就相当于系数相乘后得到新的系数组合 如153 * 4987 = <3,5,1> * <7,8,9,4> 这相当于卷积的计算,最快的方式就是fft,nlgn的复杂度就能求解,求解得到后再把每一位大于10往前赋值就行了 1 #in