题目链接:

https://vjudge.net/problem/POJ-1861

题目大意:

有一些公司,公司之间需要连接起来。给出了哪些公司可以连接以及连接边的长度。求最小生成树中最大的边,以及最小生成树的边数,以及输出一颗可行的最小生成树。

思路:

裸的kruskal

这里要求输出的是最大边和边数,不是权值,而且样例是错误的

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<sstream>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
const int INF = << ;
int dir[][] = {,,,,-,,,-};
int T, n, m;
struct edge
{
int u, v, w;
bool operator <(const edge& a)const
{
return w < a.w;
}
};
edge a[maxn], ans[];
int tot, maxx;
int par[], high[];
//初始化n个元素
void init(int n)
{
for(int i = ; i < n; i++)
{
par[i] = i;
high[i] = ;
}
}
//查询树的根
int Find(int x)
{
return par[x] == x ? x : par[x] = Find(par[x]);//路径压缩
}
void unite(int x, int y)
{
x = Find(x);
y = Find(y);
if(x == y)return;
if(high[x] < high[y])par[x] = y;//y的高度高,将x的父节点设置成y
else
{
par[y] = x;
if(high[x] == high[y])high[x]++;
}
}
bool same(int x, int y)
{
return Find(x) == Find(y);
}
int kruskal(int n, int m)//点数n,边数m
{
int sum_mst = ;//mst权值
int num= ;//已经选择的边的边数
sort(a, a + m);//边进行排序
init(n);//初始化并查集
for(int i = ; i < m; i++)
{
int u = a[i].u;
int v = a[i].v;
if(Find(u - ) != Find(v - ))//图最开始的下标是1,并查集是0
{
//printf("%d %d %d\n", u, v, a[i].w);
ans[tot++] = a[i];
maxx = max(maxx, a[i].w);
sum_mst++;
num++;
unite(u - , v - );
}
if(num >= n - )break;
}
return sum_mst;
//printf("weight of mst is %d\n", sum_mst);
}
int main()
{
while(cin >> n >> m)
{
tot = maxx = ;
for(int i = ; i < m; i++)
{
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
}
int sum = kruskal(n, m);
cout<<maxx<<endl;
cout<<sum<<endl;
for(int i = ; i < tot; i++)
cout<<ans[i].u<<" "<<ans[i].v<<endl;
}
return ;
}

最新文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
  2. table首行固定
  3. react native 页面跳转
  4. CentOs下jdk的安装
  5. java &lt;? super Fruit&gt;与&lt;? extends Fruit&gt;
  6. 在Apache+php中使用json来通讯
  7. C++_bool
  8. 【剑指offer】打印1到最大的n数字
  9. 用Eclipse 搭建一个Maven Spring SpringMVC 项目
  10. JSP指令与动作
  11. Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
  12. easyui combobox 在datagrid中动态加载数据
  13. shiro--《跟我学Shiro》网友学习系列
  14. leetcode42
  15. wpf使用FFMEPG录制屏幕
  16. CentOS7下安装Docker-Compose操作记录
  17. PureMVC剖析
  18. sql server文件另存为的时候,选择文件编码和换行
  19. thymeleaf的常见问题汇总
  20. Android开发——子线程操作UI的几种方法(待续)

热门文章

  1. 快速理解web语义化
  2. cmd 命令大全
  3. java报错排解
  4. 笔记:Spring Cloud Hystrix 封装命令
  5. 笔记:MyBatis XML配置-typeHandlers 默认类型处理器
  6. Linux下mysql的常用操作
  7. 数据库 --&gt; MySQL存储引擎介绍
  8. echarts对每个data[i]的图片添加点击事件
  9. pl/sql的介绍
  10. Maven安装配置【WIN10】