PrayerOJ1823 每條邊的最小生成樹

2021-07-26 15:30:48 字數 1382 閱讀 6983

題意:對於每一條變,求包含他的最小生成樹

cf上好像也有題

這題其實蠻巧妙的

顯然暴力的**也難搞

那我直接說標算了;

吧原圖的最小生成樹搞出來

對於詢問

如果邊不在我們求出來的最小生成樹上,那一定會形成乙個環

我們只要把環裡除詢問邊外最長的邊刪掉就可以了

妥妥的;

但是證明去找到最長邊呢

我第乙個反應就是暴力;

後來zyy大佬說用lca

對啊 如果我們把詢問邊砍掉

就是破環

lac其兩個端點,必然會訪問其環上的各個邊

所以在搞倍增表時,隨手搞乙個倍增max表就好了

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

struct csa[10001],aa[10001];//讀入a,aa備份

int g[1001][1001],deep[1001],bz[1001][15],ma[1001][15];//g來存最小生成樹,ma就是倍增max

bool b[10001];//表示邊i在不在原來的最小生成樹里

int father[1001];//我用kruskal

int n,m,xx,yy,ans,start;

bool cmp(cs a,cs b)

void dfs(int x,int y,int z)

void bzb()

} if(x==y)return;

while(1)

while(bz[x][j]!=bz[y][j])j++;

j--;

xx=max(xx,ma[y][j]);

xx=max(xx,ma[x][j]);

x=bz[x][j]; y=bz[y][j];

}}int upone(int stdd,int x)

return x;

}void lca(int x,int y)

main()

sort(a+1,a+m+1,cmp);

for(int i=1;i<=n;i++)father[i]=i;

for(int i=1;i<=m;i++)

dfs(start,0,1);

bzb();

for(int i=1;i<=m;i++)

if(b[i])cout

}

演算法 最小生成樹的關鍵邊和偽關鍵邊

給你乙個 n 個點的帶權無向連通圖,節點編號為 0 到 n 1 同時還有乙個陣列 edges 其中 edges i fromi,toi,weighti 表示在 fromi 和 toi 節點之間有一條帶權無向邊。最小生成樹 mst 是給定圖中邊的乙個子集,它連線了所有節點且沒有環,而且這些邊的權值和最...

FZU 2087 統計樹邊 (最小生成樹變形)

題目鏈結 邊可以分為2類,一類是可以構成mst,另一類是不可以的,用並查集做的時候,檢查權重相同的邊,但是2個端點不在同乙個集合的時候,這個邊就是可以選擇的 include include include include include include using namespace std def...

最小生成樹的解法

下標為1 n 返回最小生成樹的權值,返回 1說明無連通 define inf 0x3f3f3f3f int g 1001 1001 int vis 1001 lowc 1001 void init int x,int y,int v int prim int g 1001 int n return ...