最平衡生成树
题目描述
学习完最小生成树后,老师只给出几道模板题,为了尽快提升自己的编程能力,小C同学给自己出了这样一道题:最平衡生成树。
最平衡生成树是这样定义的,一个有 n 个结点的连通图的生成树包含原图中的所有n个结点,并且最长边与最短边的差值最小。
现在给你一个有n个结点的图,求最平衡生成树中最长边与最短边的差值。
最平衡生成树是这样定义的,一个有 n 个结点的连通图的生成树包含原图中的所有n个结点,并且最长边与最短边的差值最小。
现在给你一个有n个结点的图,求最平衡生成树中最长边与最短边的差值。
输入
输入第一行为n和m两个正整数,分别表示图的结点数和边数。
以下m行每行包含三个数a,b,w,分别表示每条边的两个端点和边的权值。
以下m行每行包含三个数a,b,w,分别表示每条边的两个端点和边的权值。
输出
输出满足题目要求的最小值,如果找不到最平衡生成树,则输出-1。
样例输入
4 5
1 2 3
1 3 5
1 4 6
2 4 6
3 4 7
样例输出
1
【数据范围】
对于100%的数据,2<=n<=100,0<=m<=n(n-1)/2,w<=10000。
首先看到这道题时我想不就是一道裸的最小生成树吗,然后调了一上午......首先这是道最小生成树没错。
不是裸的
不是裸的
不是裸的
然后难点是会构成多个生成树,SO每一次都要将你个并查集(找父亲节点)数组重置,然后就找最小的就好了(就是裸的了)代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=110; 4 struct str{ 5 int x,y,zhi; 6 }a[(N*(N-1))/2]; 7 int biao_ji=-1; 8 int f[(N*(N-1))/2]; 9 int n,m; 10 bool cmp(str h1,str h2){ 11 return h1.zhi<h2.zhi; 12 } 13 int find(int k){ 14 if(f[k]==k) return k; 15 else{ 16 f[k]=find(f[k]); 17 return f[k]; 18 } 19 } 20 int main(){ 21 int ji_lu=0; 22 cin>>n>>m; 23 for(int i=1;i<=m;i++){ 24 cin>>a[i].x>>a[i].y>>a[i].zhi;26 } 27 sort(a+1,a+m+1,cmp); 28 int k=0; 29 for(int i=1;i<=m;i++){ 30 for(int j=1;j<=n;j++) f[j]=j;//重置 31 int ji_lu=0; 32 for(int j=i;j<=m;j++){ 33 int tx=find(a[j].x); 34 int ty=find(a[j].y); 35 if(tx==ty) continue; 36 f[tx]=ty;//合并 37 ji_lu++; 38 if(ji_lu==n-1){ 39 if(biao_ji==-1||biao_ji>(a[j].zhi-a[i].zhi)) biao_ji=a[j].zhi-a[i].zhi;//找最小 40 break; 41 } 42 } 43 } 44 cout<<biao_ji;//没了 45 }
没了.......我的一上午啊,啊啊啊啊啊啊