洛谷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 這張圖...