题目大意:给一个图,求一个最小生成树,输出其中最大的边,并且要求这个最大的边能尽量小,再输出选择的边。
思路分析:要求最大的边尽量小,kruskal无疑是最佳选择了
代码:
#include<stdio.h>
struct pp{
int x,y,z;
}a[15500];
int n,m,ans,ansl;
int p[1050];
void qsort(int l,int r)
{
int i,j,k;
if (l>=r) return;
i=l;j=r;k=a[(l+r)/2].z;
while (i<=j)
{
while (a[i].z<k) i++;
while (a[j].z>k) j--;
if (i<=j)
{
a[0]=a[i];a[i]=a[j];a[j]=a[0];
i++;j--;
}
}
qsort(i,r);
qsort(l,j);
}
int find(int x)
{
if (p[x]==x) return x;
p[x]=find(p[x]);
return p[x];
}
void kruskal()
{
int i,x,y;
int v[1050];
for (i=1;i<=n;i++) p[i]=i;
ans=0;ansl=0;
for (i=1;i<=m;i++)
{
x=find(a[i].x);y=find(a[i].y);
if (x!=y)
{
p[y]=x;
if (ans<a[i].z) ans=a[i].z;
v[++ansl]=i;
}
}
printf("%d\n",ans);
printf("%d\n",n-1);
for (i=1;i<=ansl;i++)
printf("%d %d\n",a[v[i]].x,a[v[i]].y);
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
qsort(1,m);
kruskal();
return 0;
}