NYOJ 677 碟戰(最大流最小割)

2021-07-22 22:15:16 字數 1846 閱讀 6983

碟戰

時間限制:2000 ms | 記憶體限制:65535 kb

難度:4

描述 知己知彼,百戰不殆!在戰爭中如果被敵人掌握了自己的機密,失敗是必然的。k國在一場戰爭中屢屢失敗,就想到自己的某些城市可能會有敵方的間諜。

在仔細調查後,終於得知在哪些城市存在間諜。當然這個訊息也被敵方間諜得知,所以間諜們開始撤離,試圖到達k國唯一機場,然後搶奪飛機回國。由於城市內部比較複雜,k國領導人決定封鎖道路,阻止所有間諜到達機場。城市編號為1~n,兩個城市有不超過1條雙向道路相連。機場在n號城市,不會有間碟。

由於要節約兵力,至少要封鎖多少條道路才能阻止所有間諜到達機場?

輸入 第一行包含乙個整數t(t <= 100),為測試資料組數。

接下來每組測試資料第一行包含三個整數n,m,p(2<= n <= 200,1< m < 20000,1 <= p < n),分別表示城市數量,道路數量,存在間諜的城市的數量。

接下來的一行包含p個整數x(1 <= x < n),表示存在間諜城市的編號。

接下來的m行,每行包含兩個整數i,j,表示城市i與城市j有道路相通。

輸出 輸出「case #i: ans」(不含引號),i為第i組資料,ans為需要封鎖道路的條數。

樣例輸入

2 4 4 2

1 2

1 2

2 4

1 3

3 4

4 3 2

1 2

2 3

3 4

2 4

樣例輸出

case #1: 2

case #2: 2

** nyist第一屆校賽(專業組)

間諜所在點作為源點,n作為匯點,容量設為1,流量設為0,列舉源點到匯點的最大流,累加輸出即可

**

#include

#include

#include

#include

#include

using

namespace

std;

//稍後改用鄰接表

const

int maxn=205;

const

int inf=0x3f3f3f3f;

struct node

map[maxn][maxn];

int path[maxn];

int alpha[maxn];

int vis[maxn];

int point[maxn];//存放間諜所在點

int n;//城市數量

int m;//道路數量

int p;//與匯點相連城市的標號

int find_path(int star,int end)//傳入源點和匯點,返回最大可改進量

else

if(map[i][u].f>0&&map[i][u].c>0)}}

}return alpha[n];

}void update(int star,int end)//更新網路流,傳入源點和匯點

}int main()

int max_flow=0;

//打算列舉源點

for(int i=0; iwhile(1)

}printf("case #%d: %d\n",casen,max_flow);

// for(int i=0; i<=n; i++)

//

// printf("\n");

// for(int i=0; i<=n; i++)

//

}return

0;}

最大流 最小割

真是不知道該說些什麼呀 感覺這是我見到過的網上敘述最最最詳細的乙個演算法了。可見我才學過幾個演算法qwq 我並不認為我能比網上講的要好 所以 emmm 我就打算解釋一下 不要管這迷一樣的邏輯 先去看看題解hhh 咳咳 等會兒 好了好了 qwq 言歸正傳 這裡的dinic演算法,是對edmonds k...

最小割最大流記錄

經過一系列的學習,明白了一些東西記錄一下備忘 割 是指刪除一些邊,使剩下的網路中沒有增光路,那麼可以得出max flow c s,t 割 為什麼呢?首先我們明白知道最大流一定是根據增光路得到i的,那麼割就是包含增光路的乙個集合,那麼sum c s,t 一定是在在這個 基礎上得到的,也就是割中一定包含...

最大流 最小割定理

割 cut 是網路中頂點的劃分,它把網路中的所有頂點劃分成兩個頂點的集合源點s和匯點t。記為cut s,t 如下圖 源點 s 1 匯點 t 5。框外是容量,框內是流量 如下圖是乙個圖的割。頂點集合s 和t 構成乙個割。如果一條弧的兩個頂點分別屬於頂點集s和t那麼這條弧稱為割cut s,t 的一條割邊...