码迷,mamicode.com
首页 > 其他好文 > 详细

dinic模板。。。

时间:2018-12-19 00:35:59      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:add   algorithm   while   amp   bsp   str   tin   span   \n   

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,cnt,tot;
 7 int st,ed;
 8 int dx[8]={1,1,-1,-1,2,2,-2,-2};
 9 int dy[8]={2,-2,2,-2,1,-1,1,-1};
10 int head[80005];
11 int cur[80005];
12 int dis[80005];
13 struct node{
14     int fr;
15     int to;
16     int nxt;
17     int flw;
18 }edge[1000005];
19 void init(){
20     memset(head,-1,sizeof(head));
21 }
22 void addedge(int u,int v,int f){
23     edge[cnt].fr=u;
24     edge[cnt].to=v;
25     edge[cnt].flw=f;
26     edge[cnt].nxt=head[u];
27     head[u]=cnt++;
28     edge[cnt].fr=v;
29     edge[cnt].to=u;
30     edge[cnt].flw=0;
31     edge[cnt].nxt=head[v];
32     head[v]=cnt++;
33 }
34 bool bfs(){
35     queue<int>que;
36     memset(dis,0x3f,sizeof(dis));
37     que.push(st);dis[st]=0;
38     while(!que.empty()){
39         int u=que.front();
40         que.pop();
41         for(int i=head[u];i!=-1;i=edge[i].nxt){
42             if(!edge[i].flw)continue;
43             int v=edge[i].to;
44             if(dis[v]==0x3f3f3f3f){
45                 dis[v]=dis[u]+1;
46                 que.push(v);
47             }
48         }
49     }
50     return (dis[ed]!=0x3f3f3f3f);
51 }
52 int dfs(int u,int flw){
53     int All=0;int tmp;
54     if(u==ed)return flw;
55     for(int i=head[u];i!=-1;i=edge[i].nxt){
56         if(!edge[i].flw)continue;
57         int v=edge[i].to;head[u]=i;
58         if(dis[v]!=dis[u]+1)continue;
59         if((tmp=dfs(v,min(flw,edge[i].flw)))>0){
60             flw-=tmp;
61             edge[i].flw-=tmp;
62             edge[i^1].flw+=tmp;
63             All+=tmp;
64             if(!flw)break;
65         }
66     }
67     return All;
68 }
69 int dicnic(){
70     scanf("%d%d%d%d",&n,&m,&st,&ed);
71     int ret=0;
72     for(int i=1;i<=m;i++){
73         int u,v,w;
74         scanf("%d%d%d",&u,&v,&w);
75         addedge(u,v,w);
76     }
77     memcpy(cur,head,sizeof(cur));
78     while(bfs()){
79         ret+=dfs(st,0x3f3f3f3f);
80         memcpy(head,cur,sizeof(head));
81     }
82     return ret;
83 }
84 int main(){
85     init();
86     printf("%d\n",dicnic());
87     return 0;
88 }

 

dinic模板。。。

标签:add   algorithm   while   amp   bsp   str   tin   span   \n   

原文地址:https://www.cnblogs.com/lnxcj/p/10140836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!