題意:對於每一條變,求包含他的最小生成樹
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 ...