Drainage Ditches

Drainage Ditches

题目链接:http://poj.org/problem?id=1273

网络流

网络流模板题,学习网络流

SAP时间复杂度为O(V*E^2),代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <vector>
 5 #include <queue>
 6 #define N 205
 7 using namespace std;
 8 typedef long long LL;
 9 LL const inf=1000000000000;
10 LL mp[N][N];
11 LL n,m;
12 bool vis[N];
13 LL pre[N];
14 void init(){
15     memset(mp,0,sizeof(mp));
16     for(LL i=0;i<n;++i){
17         LL u,v,c;
18         cin>>u>>v>>c;
19         mp[u][v]+=c;
20     }
21 }
22 LL bfs(LL s,LL t){
23     memset(vis,0,sizeof(vis));
24     memset(pre,-1,sizeof(pre));
25     queue<LL>q;
26     LL flow=inf;
27     q.push(s);
28     while(!q.empty()){
29         LL p=q.front();q.pop();
30         vis[p]=1;
31         if(p==t)break;
32         for(LL i=1;i<=m;++i){
33             if(!vis[i]&&mp[p][i]!=0){
34                 flow=min(flow,mp[p][i]);
35                 pre[i]=p;
36                 q.push(i);
37             }
38         }
39     }
40     if(pre[t]==-1)return 0;
41     return flow;
42 }
43 void updata(LL t,LL flow){
44     for(LL a=t;pre[a]!=-1;a=pre[a]){
45         LL p=pre[a];
46         mp[p][a]-=flow;
47         mp[a][p]+=flow;
48     }
49 }
50 LL getflow(LL s,LL t){
51     LL maxflow=0,flow=0;
52     while(1){
53         flow=bfs(s,t);
54         updata(t,flow);
55         maxflow+=flow;
56         if(flow==0)break;
57     }
58     return maxflow;
59 }
60 int main(void){
61     while(cin>>n>>m){
62         init();
63         cout<<getflow(1,m)<<endl;
64     }
65 }
 1 struct Edge{
 2     int from,to,cap,flow;
 3     Edge(int _from=0,int _to=0,int _cap=0,int _flow=0){
 4         from=_from;to=_to;cap=_cap;flow=_flow;
 5     }
 6 };
 7 vector<Edge>e;
 8 vector<int>adj[207];
 9 int a[207],p[207];//a[i]为可增广的权值
10 void addEdge(int from,int to,int cap){
11     adj[from].push_back(e.size());
12     adj[to].push_back(e.size()+1);
13     e.push_back(Edge(from,to,cap,0));
14     e.push_back(Edge(to,from,0,0));
15 }
16 int MaxFlow(int s,int t){
17     int flow=0;
18     while(1){
19         queue<int>q;//findFlow
20         q.push(s);
21         memset(a,0,sizeof(a));
22         a[1]=INF;
23         while(!q.empty()){
24             int u=q.front();q.pop();
25             for(int i=0;i<adj[u].size();i++){
26                 Edge ee=e[adj[u][i]];
27                 int v=ee.to;
28                 if(!a[v]&&ee.cap>ee.flow){
29                     a[v]=min(a[u],ee.cap-ee.flow); 
30                     p[v]=adj[u][i];//记录边的序号
31                     q.push(v);
32                 }
33             }
34             if(a[t])break;
35         }
36         if(!a[t])break;
37         for(int i=t;i!=1;i=e[p[i]].from){//updata残余网络
38             e[p[i]].flow+=a[t];
39             e[p[i]^1].flow-=a[t];
40         }
41         flow+=a[t];
42     }
43     return flow;
44 }
另附邻接表版模板

 

posted @ 2016-11-21 21:32  barriery  阅读(134)  评论(0编辑  收藏  举报