洛谷1345 奶牛的電信 (最大流最小割)

2022-06-28 19:18:09 字數 1403 閱讀 5761

洛谷1345

給出點的個數,邊的條數,源點和匯點。

分別給出與邊相連的點,邊權為1。

求最少刪去多少點使得源點和匯點不連通。

題目是求刪點,最大流最小割演算法刪的是邊,所以要割點轉化為割邊(最大流最小割其實並不能算乙個演算法,只是將求最小割轉化為求最大流)

將乙個點拆成兩個點,其中乙個點負責連線入邊,另外乙個點負責連線出邊,拆成的兩個點之間邊權為1,表示只能乙個點只能刪一次(如果這條邊被刪了,入邊和出邊無法連通表示點被刪除)。由於求的是刪除點的個數,其他的邊置為inf。

舉個栗子

這題我的**建了反向邊,但是有些ac**沒有建反向邊,我也不知道為什麼可以不用建反向邊,望路過的大佬指點指點。

#include using namespace std;

#define fre freopen("data.in","r",stdin);

#define ms(a) memset((a),0,sizeof(a))

#define go(i,a,b) for(register int (i)=(a);(i)

#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);++(i))

#define sf(x) scanf("%d",&(x))

#define reg register

typedef long long ll;

const int inf=(100000);

const int maxn=1e2+5;

const int maxm=6e2+5;

struct nodee[(maxn+maxm)<<1];

int n,m,s,t;

int head[maxn<<1],cur[maxn<<1],deep[maxn<<1];

int cnt;

queueq;

inline void add(int x,int y,int w)

inline bool bfs()}}

return deep[t];

}int dfs(int now,int nowflow)

for(int i=cur[now],v;~i;i=e[i].next)

if(deep[v]==deep[now]+1&&e[i].flow)

}if(totflow<=0)deep[now]=-2;

return totflow;

}inline void dinic()

printf("%d\n",maxflow);

}int main()

s+=n;

for(int i=0,x,y;i

dinic();

return 0;

}

洛谷 P1345 奶牛的電信

題目描述 就是讓你求無向圖最小割點數 解析 把每個點分成兩個點,連一條距離為一的邊,再把任意兩個聯通的點之間連上正無窮大的邊,這樣求出來最小割一定是割流量為一的邊。特別注意的就是源點為出發點的出點,匯點為終點的入點,否則跑出來的值一定是一。程式 include include include inc...

Luogu1345 奶牛的電信(網路流)

很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。有兩頭奶牛就想 如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。以如下網路為例 1 3 2 這張圖...

Luogu1345 奶牛的電信(網路流)

很不幸,有時候奶牛會不小心踩到電腦上,農夫約翰的車也可能碾過電腦,這台倒霉的電腦就會壞掉。這意味著這台電腦不能再傳送電郵了,於是與這台電腦相關的連線也就不可用了。有兩頭奶牛就想 如果我們兩個不能互發電郵,至少需要壞掉多少臺電腦呢?請編寫乙個程式為她們計算這個最小值。以如下網路為例 1 3 2 這張圖...