题目描述
学习完最小生成树后,老师只给出几道模板题,为了尽快提升自己的编程能力,小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。
【样例输入2】
3 0
【样例输出2】
-1
对于100%的数据,2<=n<=100,0<=m<=n(n-1)/2,w<=10000。
【样例输入2】
3 0
【样例输出2】
-1
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 105 4 int pre[N],n,m,ans=-1; 5 struct lhy 6 { 7 int x,y,cost; 8 }glq[N*(N-1)/2]; 9 int find(int t) 10 { 11 while(t!=pre[t]) t=pre[t]=pre[pre[t]]; 12 return t; 13 } 14 bool cmp(lhy a,lhy b) 15 { 16 return a.cost<b.cost; 17 } 18 int main() 19 { 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=m;i++) 22 { 23 scanf("%d%d%d",&glq[i].x,&glq[i].y,&glq[i].cost); 24 } 25 sort(glq+1,glq+m+1,cmp); 26 for(int i=1;i<=m;i++) 27 { 28 29 for(int j=1;j<=n;j++) pre[j]=j; 30 int cnt=0; 31 for(int j=i;j<=m;j++) 32 { 33 int lhy_s=find(glq[j].x),glq_zz=find(glq[j].y); 34 if(lhy_s==glq_zz) continue; 35 pre[lhy_s]=glq_zz; 36 cnt++; 37 if(cnt==n-1) 38 { 39 if(ans==-1||ans>(glq[j].cost-glq[i].cost)) ans=glq[j].cost-glq[i].cost; 40 break; 41 } 42 } 43 } 44 printf("%d",ans); 45 return 0; 46 }