题干:
给你n个点和m条边及其权值,求一个能使图联通且单条边权最大值最小的边的集合。
输出边权的最大值,边的个数,边的起始点。
思路:
Kruskal求最小生成树模板题,记录下最大边权。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
int n,m,tot,f[32000],ans[2000],ans1[2000],mx=-1,sum;
struct stu
{
int u;
int v;
int cost;
}edge[32000];
void add(int a,int b,int c)
{
edge[tot].u=a;
edge[tot].v=b;
edge[tot++].cost=c;
}
bool cmp(stu a,stu b)
{
return a.cost<b.cost;
}
int find(int a)
{
if(f[a]==-1) return a;
else return f[a]=find(f[a]);
}
int main()
{
int a,b,c;
memset(f,-1,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
//add(b,a,c);
}
sort(edge,edge+tot,cmp);
for(int i=0;i<m;i++){
int u=edge[i].u;
int v=edge[i].v;
int cost=edge[i].cost;
int t1=find(u),t2=find(v);
if(t1!=t2)
{
f[t1]=t2;
ans[sum]=u;
ans1[sum++]=v;
if(cost>mx)
mx=cost;
}
}
printf("%d\n%d\n",mx,sum);
for(int i=0;i<sum;i++){
printf("%d %d\n",ans[i],ans1[i]);
}
return 0;
}