差值最小生成樹 LCT

2021-08-30 09:01:21 字數 1160 閱讀 9188

傳送門

將邊按邊權從小到大排序;

如果插入的兩個點在一棵樹上,就找他們路徑上權值最小的那條邊並刪除,然後在新加一條邊

否則直接加就好了

路徑需要以點的形式插入到lct,第i跳路徑對於i+n號節點,link(x,y) 就link(x,i+n),link(i+n,y) 就好了

維護一下最小值

#include#define n 1000005

#define lc t[x].ch[0]

#define rc t[x].ch[1]

using namespace std;

struct nodet[n];

struct edgee[n];

bool cmp(edge a,edge b)

int n,m,ans=1e9,mi,cnt,vis[n],val[n];

int read()

while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();

return cnt*f;

}bool isroot(int x)

void pushup(int x)

void pushdown(int x)

}void pushpath(int x)

void rotate(int x)

void splay(int x)

}void access(int x)

int findroot(int x)

void makeroot(int x)

void link(int x,int y)

void cut(int x,int y)

int split(int x,int y)

int main()

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

for(int i=0;i<=n;i++) val[i]=1e9;

for(int i=1;i<=m;i++) val[i+n]=e[i].val;

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

else

if(cnt==n-1) ans=min(ans,e[i].val-e[mi].val);

}printf("%d\n",ans); return 0;

}

POJ3522 最小差值生成樹 LCT

題目描述 給定乙個標號為從 1 到 n的 有 m 條邊的無向圖,求邊權最大值與最小值的差值最小的生成樹。輸入格式 第一行兩個數 n,m,表示圖的點和邊的數量。第二行起 m 行,每行形如 ui,vi,wi,代表 ui到 vi 間有一條長為 wi 的無向邊。輸出格式 輸出一行乙個整數,代表你的答案。資料...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...