码迷,mamicode.com
首页 > 编程语言 > 详细

网络流-Edmonds-Karp算法

时间:2018-07-19 16:11:30      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:struct   climits   代码   false   max   queue   iter   stream   int   

网络流的Edmonds-Karp算法代码

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<list>
 4 #include<queue>
 5 #include<climits>
 6 using namespace std;
 7 int n,m,s,t;
 8 int map[1001][1001];//残存网络
 9 int store[1001][1001]; //输入网络
10 int c[1001][1001];//流网络
11 struct datatype{
12     list<int>path;
13     int pos;
14 };
15 queue<datatype> q;
16 bool vis[1001];
17 void cal(datatype x){
18     list<int>::iterator it;
19     int f=INT_MAX;
20     int last=*x.path.begin();
21     it=x.path.begin();
22     it++;
23     for(it;it!=x.path.end();it++){
24         f=min(f,map[last][*it]);
25         last=*it;
26     }
27     last=*x.path.begin();
28     it=x.path.begin();
29     it++;
30     for(it;it!=x.path.end();it++){
31         if(store[last][*it])
32             c[last][*it]+=f;
33         else
34             c[*it][last]-=f;
35         map[last][*it]-=f;
36         map[*it][last]+=f;
37         last=*it;
38     }
39     return;
40 }
41 bool get_path(datatype start){
42     q.push(start);
43     while(!q.empty()){
44         datatype now=q.front();
45         if(now.pos==t){
46             cal(now);
47             return true;
48         }
49         for(int i=1;i<=n;i++)
50             vis[i]=false;
51         list<int>::iterator it;
52         for(it=now.path.begin();it!=now.path.end();it++)
53             vis[*it]=true;
54         for(int i=1;i<=n;i++)
55             if(!vis[i]&&map[now.pos][i]){
56                 datatype tmp;
57                 tmp.path=now.path;
58                 tmp.path.push_back(i);
59                 tmp.pos=i;
60                 q.push(tmp);
61             }
62         q.pop();
63     }
64     return false;
65 }
66 int main(){
67     cin>>n>>m;
68     for(int i=1;i<=n;i++)
69         for(int j=1;j<=n;j++){
70             map[i][j]=0;
71             c[i][j]=0;
72         }
73     for(int i=1;i<=m;i++){
74         int x,y,z;
75         cin>>x>>y>>z;
76         map[x][y]=z;
77     }
78     for(int i=1;i<=n;i++)
79         for(int j=1;j<=n;j++)
80             store[i][j]=map[i][j];
81     cin>>s>>t;
82     datatype start;
83     start.path.clear();
84     start.path.push_back(s);
85     start.pos=s;
86     while(get_path(start))
87         while(!q.empty())
88             q.pop();
89     int res=0;
90     for(int i=1;i<=n;i++)
91         if(c[i][t]>0)
92             res+=c[i][t];
93     cout<<res<<endl;
94     return 0;
95 }

 

网络流-Edmonds-Karp算法

标签:struct   climits   代码   false   max   queue   iter   stream   int   

原文地址:https://www.cnblogs.com/shao0099876/p/9335787.html

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