[HihoCoder1369]网络流一·Ford-Fulkerson算法

思路:

最大流模板。

 1 #include<queue>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<vector>
 5 #include<cstring>
 6 inline int getint() {
 7     char ch;
 8     while(!isdigit(ch=getchar()));
 9     int x=ch^'0';
10     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
11     return x;
12 }
13 const int N=501,M=20000,inf=0x7fffffff;
14 struct Edge {
15     int from,to,remain;
16 };
17 Edge e[M<<1];
18 std::vector<int> g[N];
19 int sz=0;
20 inline void add_edge(const int u,const int v,const int w) {
21     e[sz]=(Edge){u,v,w};
22     g[u].push_back(sz);
23     sz++;
24 }
25 int s,t;
26 int a[N],p[N];
27 inline int Augment() {
28     memset(a,0,sizeof a);
29     a[s]=inf;
30     std::queue<int> q;
31     q.push(s);
32     while(!q.empty()&&!a[t]) {
33         int x=q.front();
34         q.pop();
35         for(unsigned i=0;i<g[x].size();i++) {
36             Edge &y=e[g[x][i]];
37             if(!a[y.to]&&y.remain) {
38                 p[y.to]=g[x][i];
39                 a[y.to]=std::min(a[x],y.remain);
40                 q.push(y.to);
41             }
42         }
43     }
44     return a[t];
45 }
46 inline int EdmondsKarp() {
47     int maxflow=0;
48     while(int flow=Augment()) {
49         for(int i=t;i!=s;i=e[p[i]].from) {
50             e[p[i]].remain-=flow;
51             e[p[i]^1].remain+=flow;
52         }
53         maxflow+=flow;
54     }
55     return maxflow;
56 }
57 int main() {
58     int n=getint(),m=getint();
59     s=1,t=n;
60     while(m--) {
61         int u=getint(),v=getint(),w=getint();
62         add_edge(u,v,w);
63         add_edge(v,u,0);
64     }
65     printf("%d\n",EdmondsKarp());
66     return 0;
67 }

 

转载于:https://www.cnblogs.com/skylee03/p/7250117.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值