#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn = 15005;
int n , m , fa[maxn] , rank[maxn];
struct T{
int u , v , c;
}edge[maxn * 2] , edge1[maxn * 2];
void init(){
for(int i = 1 ; i <= n ; i ++){
fa[i] = i;
rank[i] = 0;
}
}
int cmp( const void *a , const void *b )
{
struct T *cc = (T *)a;
struct T *dd = (T *)b;
if(cc->c != dd->c) return cc->c - dd->c;
else return dd->u - cc->u;
}
int find_set(int x){
if(fa[x] != x){
fa[x] = find_set(fa[x]);
}
return fa[x];
}
bool Union(int x , int y){
x = find_set(x);
y = find_set(y);
if(x == y) return false;
if(rank[x] > rank[y]){
fa[y] = x;
}
else{
if(rank[y] == rank[x]){
rank[y] ++;
}
fa[x] = y;
}
return true;
}
void kruskal(){
int k = 0;
int max = 0;
for(int i = 0 ; i < m ; i ++){
if(Union(edge[i].u , edge[i].v)) {
edge1[k ++] = edge[i];
if(max < edge[i].c) max = edge[i].c;
}
}
printf("%d\n", max);
printf("%d\n", k);
for (int i = 0; i < k; i++){
printf("%d %d\n", edge1[i].u, edge1[i].v);
}
}
int main(){
while(~scanf("%d%d" , &n , &m)){
init();
for(int i = 0 ; i < m ; i ++){
scanf("%d%d%d" , &edge[i].u , &edge[i].v , &edge[i].c);
}
qsort(edge , m , sizeof(edge[0]) , cmp);
kruskal();
}
return 0;
}
poj 1861 Network (kruskal 最小生成树)
最新推荐文章于 2021-03-04 19:28:30 发布