BZOJ2521 最小生成樹 最小割

2021-08-24 17:25:42 字數 1563 閱讀 7375

description

secsa最近對最小生成樹問題特別感興趣。他已經知道如果要去求出乙個n個點、m條邊的無向圖的最小生成樹有乙個krustal演算法和另乙個prim的演算法。另外,他還知道,某乙個圖可能有多種不同的最小生成樹。例如,下面圖 3中所示的都是圖 2中的無向圖的最小生成樹:

當然啦,這些都不是今天需要你解決的問題。secsa想知道對於某一條無向圖中的邊ab,至少需要多少代價可以保證ab邊在這個無向圖的最小生成樹中。為了使得ab邊一定在最小生成樹中,你可以對這個無向圖進行操作,一次單獨的操作是指:先選擇一條圖中的邊 p1p2,再把圖中除了這條邊以外的邊,每一條的權值都減少1。如圖 4所示就是一次這樣的操作:

input

輸入檔案的第一行有3個正整數n、m、lab分別表示無向圖中的點數、邊數、必須要在最小生成樹中出現的ab邊的標號。

接下來m行依次描述標號為1,2,3…m的無向邊,每行描述一條邊。每個描述包含3個整數x、y、d,表示這條邊連線著標號為x、y的點,且這條邊的權值為d。

輸入檔案保證1<=x,y<=n,x不等於y,且輸入資料保證這個無向圖一定是乙個連通圖。

output

輸出檔案只有一行,這行只有乙個整數,即,使得標號為lab邊一定出現最小生成樹中的最少操作次數。

sample input

4 6 1

1 2 2

1 3 2

1 4 3

2 3 2

2 4 4

3 4 5

sample output
1
hint

第1個樣例就是問題描述中的例子。

1<=n<=500,1<=m<=800,1<=d<10^6

solution

首先,除了一條邊,所有邊的權值-1等價於這條邊的權值+1。然後我們回憶kruskal的過程,這條邊保證在最小生成樹上,等價於:如果我們只加入權值<=這條邊權值的邊,該條邊的兩端點無法連通。那麼直接轉化成最小割問題,割掉每條邊的代價=選定邊權值-當前邊權值+1即可。

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf=0x7fffffff,maxn=501;

int n,m,lab,tot,s,t,head[maxn],cur[maxn],dep[maxn],u[maxn<<1],v[maxn<<1],w[maxn<<1],to[maxn<<3],nxt[maxn<<3],val[maxn<<3];

void add_edge(int u,int v,int w)

bool bfs()

}return0;}

int dfs(int u,int now)}}

return ans;

}int dinic()

return ans;

}int main()

}printf("%d",dinic());

return

0;}

bzoj2561 最小生成樹 最小割

給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?第一行包含用空格隔開的兩個整數,分別為n和m 接...

BZOJ 2561 最小生成樹 最小割

為什麼刪除最少的邊判連通連最小割都沒想到。估計是廢了。考慮kruskal的過程 最小生成樹 如果有一條邊 u,v 若所有比他小的邊能使u,v聯通,這條邊就不必加入生成樹中,最大生成樹也同理。於是我們只要把權值比l小的調出來跑最小割,權值比l大的也挑出來跑最小割。兩個加一下就是答案了。type edg...

bzoj2561 最小生成樹 最小割

time limit 10 sec memory limit 128 mb submit 1857 solved 882 submit status discuss 給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一...