题意:给出n个点和m条边,求出最小生成树,输出最小生成树权值最大的第一条边,然后再输出最小生成树的边数,以及每一条边
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n,m;
int rank[1001];
int f[1001];
void init(){
int i;
for(i=1;i<=n;i++)
{
f[i]=i;
rank[i]=0;
}
}
int father(int s){
if(s!=f[s])
f[s]=father(f[s]);
return f[s];
}
void unionset(int s,int t){
int i=father(s);
int j=father(t);
if(rank[i]<rank[j])
f[i]=j;
else
{
f[j]=i;
if(rank[i]==rank[j])
rank[i]++;
}
}
struct e{
int s,t,w;
};
e edge[15001];
e ans[15001];
int cmp(const void *a,const void *b){
return (*(e*)a).w-(*(e*)b).w;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
cin>>n>>m;
init();
for(i=1;i<=m;i++)
{
cin>>edge[i].s>>edge[i].t>>edge[i].w;
}
qsort(edge+1,m,sizeof(e),cmp);
k=0;
for(i=1;i<=m;i++)
{
if(father(edge[i].s)!=father(edge[i].t))
{
k++;
ans[k].s=edge[i].s;
ans[k].t=edge[i].t;
unionset(edge[i].s,edge[i].t);
if(k==n-1)
{
cout<<edge[i].w<<endl;
cout<<n-1<<endl;
break;
}
}
}
for(i=1;i<n;i++)
cout<<ans[i].s<<' '<<ans[i].t<<endl;
}
int main(){
read();
return 0;
}