UVA908[Re-connecting Computer Sites]题解

这篇具有很好参考价值的文章主要介绍了UVA908[Re-connecting Computer Sites]题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原题

1.题意分析

题意就是给你很多组数,对于每组数,有三组小数据。第一组小数据先输入一个n表示顶点数,然后再输入n-1条边表示初始边数。其它组小数据先输入一个数k,表示增加的边的数量,然后再输入k条边,表示增加的边。在输入第二组小数据时,要先把边清空,重新输入,但是边的数量不变。

2.做法

题意不难理解,说白了就是最小生成树的板子题。很明显,对于每组数,可以分为两组大数据。第一组小数据是一组大数据;第二组和第三组小数据可以分为一组大数据。对于每组大数据,求出最小生成树,再把数据清空,再求一遍。就是最终的正解了

3.关于最小生成树

板子

板子题原题

kruskal最小生成树算法的详细分析

注意输入的换行,换行卡了我10分钟

它终于来了文章来源地址https://www.toymoban.com/news/detail-674887.html

代码

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e5 + 100;

int parents[N];

struct edge
{
	int from, to, val;
}edges[N];

bool cmp(edge a, edge b)
{
	if(a.val != b.val)
	{
		return a.val < b.val;
	}else
	{
		return a.from > b.from;
	}
	return a.to > b.to;
}

int cnt = 0;
void add(int u, int v, int w)
{
	cnt++;
	edges[cnt].from = u;
	edges[cnt].to = v;
	edges[cnt].val = w;
}

int Find(int n)
{
	int last_find = n;
	while(true)
	{
		if(parents[n] == n || parents[n] == last_find)
		{
			return n;
		}
		last_find = n;
		n = parents[n];
	}
}

int kruskal(edge* edges, int points, int bian)
{
	int w = 0;
	int cur_cnt = 0;
	int ans = 0;
	sort(edges + 1, edges + bian + 1, cmp);
	while(cur_cnt < points-1)
	{
		w++;
		int node_1 = Find(edges[w].from);
		int node_2 = Find(edges[w].to);
		if(node_1 != node_2)
		{
			parents[Find(node_1)] = parents[Find(node_2)];
			ans += edges[w].val;
			cur_cnt++;
		}
//		cout << cur_cnt << " " << w << endl;
//		cout << ans << endl;
	}
	return ans;
}

void init(int n)
{
	cnt = 0;
	for(int i = 1;i <= n;i++)
	{
		parents[i] = i;
	}
}

int main()
{
	int ccnntt=0;
	int n;
	while(cin >> n)
	{
		if(ccnntt!=0){
			cout<<endl;
		}
		ccnntt++;
		init(n);
		for(int i = 1;i < n;i++)
		{
			int u, v, w;
			cin >> u >> v >> w;
			add(u, v, w);
		}
		cout << kruskal(edges, n, n - 1) << endl;
		
		init(n);
		int k;
		cin >> k;
		for(int i = 1;i <= k;i++)
		{
			int u, v, w;
			cin >> u >> v >> w;
			add(u, v, w);
		}
		int m;
		cin >> m;
		for(int i = 1;i <= m;i++)
		{
			int u, v, w;
			cin >> u >> v >> w;
			add(u, v, w);
		}
		cout << kruskal(edges, n, k + m) << endl;
	}
	
	return 0;	
} 

到了这里,关于UVA908[Re-connecting Computer Sites]题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • npm下载报错npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network re

    1、设置代理关闭 2、清除缓存 但我执行这句后会报下面的错误 3、又按照博主写的执行下面语句 显示以下结果 然后说是要降低npm版本 还是报错!!! 1、查看npm镜像设置 2、将npm设置为淘宝镜像 3、再次查看npm镜像设置 再下载终于成功了!!

    2024年02月12日
    浏览(36)
  • leetcode原题: 峰与谷

    题目: 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。 示例: 输入: [5, 3, 1, 2, 3] 输出: [5, 1, 3,

    2024年02月11日
    浏览(40)
  • leetcode原题: 生存人数

    题目: 给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i] ,死亡年份为 death[i] ,实现一个方法以计算生存人数最多的年份。 你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入

    2024年02月10日
    浏览(33)
  • leetcode原题:节点间通路

    题目: 给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。 示例:  输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2  输出:true  解题思路: 本题借助队列,利用队列的先进先出的特点,保证访问每个节点的顺序不被破坏。 1. 建立邻接表map ,讲

    2024年02月13日
    浏览(40)
  • leetcode原题:变位词组(哈希)

    题目: 编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。 示例: 输入: [\\\"eat\\\", \\\"tea\\\", \\\"tan\\\", \\\"ate\\\", \\\"nat\\\", \\\"bat\\\"], 输出: [   [\\\"ate\\\",\\\"eat\\\",\\\"tea\\\"],   [\\\"nat\\\",\\\"tan\\\"],   [\\\"bat\\\"] ] 解题思路: 本题是需要将相同的变位词放在一维数组中,

    2024年02月11日
    浏览(28)
  • leetcode原题:绘制直线(位运算)

    题目: 已知一个由像素点组成的单色屏幕,每行均有 w 个像素点,所有像素点初始为 0 ,左上角位置为 (0,0) 。 现将每行的像素点按照「每 32 个像素点」为一组存放在一个 int 中,再依次存入长度为 length 的一维数组中。 我们将在屏幕上绘制一条从点 (x1,y) 到点 (x2,y) 的直线(

    2024年02月12日
    浏览(29)
  • 计算机网络——习题——书上原题

    目录 第一章 1. 填空题 第二章 1. 填空题 第三章 1. 填空题 2.选择题 第四章 1. 填空题 第五章 第六章 1. 填空题 (1)计算机网络的主要功能包括 资源共享、数据通信、分布式处理、提高计算机的可靠性和集中管理 。 (2)常用的网络传输介质为 有线 和 无线 两种。其中,有线

    2024年02月03日
    浏览(27)
  • leetcode原题: 堆箱子(动态规划实现)

    题目: 给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。 输入使用数组 [wi, di, hi] 表示每个箱子。 示例:  输入:box

    2024年02月11日
    浏览(28)
  • leetcode原题:颜色填充(经典的递归问题)

    题目: 编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。 待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。 「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的

    2024年02月12日
    浏览(33)
  • 【区间 DP】运用区间 DP 解决古老原题

    这是 LeetCode 上的 「664. 奇怪的打印机」 ,难度为 「困难」 。 Tag : 「区间 DP」 有台奇怪的打印机有以下两个特殊要求: 打印机每次只能打印由 同一个字符 组成的序列。 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。 给你一个字符串 s ,你的

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包