傳送門
將邊按邊權從小到大排序;
如果插入的兩個點在一棵樹上,就找他們路徑上權值最小的那條邊並刪除,然後在新加一條邊
否則直接加就好了
路徑需要以點的形式插入到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...