uva1395 Slim Span
Slim Span
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define N 100090
#define MAXN 99999999
using namespace std;
int n,m,t=0;
int pre[N],used[N];
struct node
{
int st,ed,val;
}e[N];
void init()
{
for(int i=0;i<=105;i++)
{
pre[i]=i;
}
t=0;
}
int cmp(node a,node b)
{
return a.val<b.val;
}//从小到大排序
int Find(int m)
{
int n=m;
while(n!=pre[n])
n=pre[n];
//pre[m]=n;
return n;
}//查找根节点
void kruskal(int l)
{
int cha=MAXN;
for(int i=0;i<l;i++)
{
init();
for(int j=i;j<l;j++)
{
int fx=Find(e[j].st);
int fy=Find(e[j].ed);
if(fx!=fy)
{
pre[fx]=fy;
t++;
}
if(t==n-1)
{
cha=min(cha,e[j].val-e[i].val);
break;
}
}
}
if(cha==MAXN)
printf("-1\n");
else
printf("%d\n",cha);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&e[i].st,&e[i].ed,&e[i].val);
}
sort(e,e+m,cmp);
kruskal(m);
}
return 0;
}
思路:遍历(暴力)。。。不要想的太复杂,不会超时的,数据很小的。从小到大生成一个最小生成树,求下差值。然后把最短的边删去,再生成一颗最小生成树,更新最小差值,知道不能生成树。如果一开始就不能生成树,直接输出-1.