計蒜課/排澇(Edmond-Karp)

題目鏈接: https://nanti.jisuanke.com/t/36

題意:中文題目誒~

思路: 最大流模板題....

關於最大流算法blog:

  http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html

  http://blog.csdn.net/y990041769/article/details/21026445

  http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html

代碼:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <queue>
 4 #include <string.h>
 5 using namespace std;
 6
 7 const int MAXN=2e2+10;
 8 const int inf=0x7fffffff;
 9 int capacity[MAXN][MAXN];//記錄殘留網絡流量
10 int flow[MAXN]; //標記從源點到當前節點實際還剩多少流量可用
11 int pre[MAXN]; //pre[i]爲i的父親節點
12 int n, m;
13
14 int bfs(int src, int des){
15     queue<int> q;
16     while(!q.empty()){
17         q.pop();
18     }
19     for(int i=1; i<=m; i++){
20         pre[i]=-1;
21     }
22     pre[src]=0;
23     flow[src]=inf;
24     q.push(src);
25     while(!q.empty()){
26         int indx=q.front();
27         q.pop();
28         if(indx==des) break;//找到了增廣徑
29         for(int i=1; i<=m; i++){
30             if(i!=src&&capacity[indx][i]>0&&pre[i]==-1){
31                 pre[i]=indx;
32                 flow[i]=min(capacity[indx][i], flow[indx]);
33                 q.push(i);
34             }
35         }
36     }
37     if(pre[des]==-1) return -1;
38     return flow[des];
39 }
40
41 int edmond_karp(int src, int des){
42     int increasement=0;
43     int sumflow=0;
44     while((increasement=bfs(src, des))!=-1){
45         int k=des; //利用前區尋找路徑
46         while(k!=src){
47             int last=pre[k];
48             capacity[last][k]-=increasement;//改變正向邊容量
49             capacity[k][last]+=increasement;//改變反向邊容量
50             k=last;
51         }
52         sumflow+=increasement;
53     }
54     return sumflow;
55 }
56
57 int main(void){
58     int start, end, ci;
59     while(~scanf("%d%d", &n, &m)){
60         memset(capacity, 0, sizeof(capacity));
61         memset(flow, 0, sizeof(flow));
62         for(int i=0; i<n; i++){
63             scanf("%d%d%d", &start, &end, &ci);
64             if(start==end) continue;
65             capacity[start][end]+=ci;//可能有重邊
66         }
67         printf("%d\n", edmond_karp(1, m));
68     }
69     return 0;
70 }

时间: 2024-10-10 13:05:30

計蒜課/排澇(Edmond-Karp)的相关文章

計蒜客/數正方形(dp)

題目鏈接:https://nanti.jisuanke.com/t/44 題意:中文題誒~ 思路: 用dp[i][j]存儲以(i, j)爲左上定點的最大正方形變長,從右下角網左上角一次計算所有頂點: 通過畫圖不難分析出動態專題方程式爲: dp[i][j]=min(dp[i+1][j+1], dp[i+1][j], dp[i][j+1]) + 1 需要注意的是如何累計所有變長的正方形數目, 對於坐標(i, j), 從2~dp[i][j]依次累加一次即可: 代碼: 1 #include <iostr

网络最大流的(Edmond Karp)算法

原来一听到网络最大流啊,什么BFS,DFS的就感觉特别的陌生,也感觉特别的头疼,如今我终于要学习到这里了这也标志着我要真正的要学习算法和搞acm了,所以我更要努力的学习力求向上把它学好. 不废话了,这最大流问题通过我今天的学习和理解终于有点眉目了,我就做个随笔,首先了解一下容量网络,百度了一下:         容量网络:在有向图D=(V,A),指定一个点为发点,记作         ,指定另一个点为收点,记作         ,其余点叫作中间点.对于A的每条弧(         ),都对应一个

Linux Kernel 排程機制介紹

http://loda.hala01.com/2011/12/linux-kernel-%E6%8E%92%E7%A8%8B%E6%A9%9F%E5%88%B6%E4%BB%8B%E7%B4%B9/ Linux Kernel 排程機制介紹 Linux Kernel 排程機制介紹 [email protected] by loda. 2011/12/2 多核心架構儼然是目前智慧型手機方案的新趨勢,隨著省電與效能上的考量,多核心的架構各家方案也都有所差異.為能讓同一個Linux Kernel在不同效

网络流初步: 最大流

好吧.. 直接上模板... 思想可以看看这里点击打开链接 </pre><pre name="code" class="cpp"> queue<int> q; memset(flow,0,sizeof(flow)); int f = 0; while(true){ memset(a,0,sizeof(a)); a[s] = INF; q.push(s); while(!q.empty)){ //BFS找增广路 int u = q.f

C++ 基于Dijkstra算法和基于BFS算法的Ford Fulkson算法比较

#include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> #include<cstring> #include<vector> #include<queue> #include<array> #include<windows.h> using namespace std; const int INF = INT_MAX

最大流(EK)

最大流 — Edmond Karp算法 Edmond Karp算法的大概思想: 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束. 在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉及到反向边). 而找到delta后,则使最大流值加上delta,更新为当前的最大流值. (粗体表明需要掌握的概念) 关于反向边: 以下摘至HDOJ的课件和网上的: 首先来看一下基本的网络流最大流模型. 有n个点,有m条有向边,有一个点很特殊,只出

用最通俗的语言让你学会网络流

我们想象一下自来水厂到你家的水管网是一个复杂的有向图,每一节水管都有一个最大承载流量.自来水厂不放水,你家就断水了.但是就算自来水厂拼命的往管网里面注水,你家收到的水流量也是上限(毕竟每根水管承载量有限).你想知道你能够拿到多少水,这就是一种网络流问题. 在网上找了很久资料,虽然讲解网络流的资料很多但是浅显易懂的很少(可能是我太蒻了吧),写这篇文章只希望点进来的人都能学会网络流(都能点赞) 我尽量用通俗易懂的语言讲解,同时结合图示理解. 我将讲解以下网络流算法: 最大流 最小费用最大流 先从最基

統計學簡史

統計是初產生於研究對國家,特別是對其經濟以及人口的描述.當時現代數學尚未形成.因此那時的統計史基本上是經濟史的範疇.現代統計主要起源於研究總體(population),變差(variation)和簡化數據(reduction of data). 第一個經典文獻屬於John Graunt(1620-1674),其具有技巧的分析指出了把一些龐雜.令人糊塗的數據化簡為幾個說明問題的表格的價值.他注意到在非瘟疫時期,一個大城市每年死亡數有統計規律,而且出生兒的性別比為1.08,即每生13個女孩就有14個

VR&HTC課程

課程目標: 第1天課程學完之後,您會充分理解VR(含AR.MR)技術的本質.原理和產業發展趨勢.包括掌握VR技術風潮下的完整產業生態.投資策略和文創出版的IP授權模式等新機會. 第2天課程學完之後,您會深刻領會VR身歷其境(定位其中)的沉浸感(帶入感)是來自於幕後的3D素材(Material),您先學會360全景拍攝的技巧和後製作流程,並實際演練.此外,您還會熟悉其他的VR素材製作途徑和工具. 第3天課程學完之後,您會完整認識當今全球最先進的HTC Vive產品的結構.安裝和使用.然後深入學習使