碟戰
時間限制: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 的一條割邊...