首页 > 其他分享 >UVA908[Re-connecting Computer Sites]题解

UVA908[Re-connecting Computer Sites]题解

时间:2023-08-27 11:12:15浏览次数:40  
标签:node UVA908 cnt val int 题解 Sites edges parents

原题

1.题意分析

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

2.做法

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

3.关于最小生成树

板子

板子题原题

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

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

它终于来了

代码

#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;	
} 

标签:node,UVA908,cnt,val,int,题解,Sites,edges,parents
From: https://www.cnblogs.com/bookerbug/p/17659994.html

相关文章

  • 题解:城市
    题目链接你说得对,但是不如换根。换根是由原先的树形DP简单变换而来,故事发生在这道叫做《城市》的题目中,在这里你妄图求解每个点到树中其它所有节点的距离,即\(f_i=\sum_{j=1}^ndis_{i\toj}\)。可以一次dfs求解出\(f_{root}\),然后我们发现走过一条边\((u,v,w)\)会使......
  • LGR-156-Div.3 题解
    LGR-156-Div.3题解洛谷网校8月普及组月赛I&MXOIRound1&飞熊杯#2第一次AK一个比赛!而且排名这么靠前!!!T1宝箱题目链接思路注意到答案有两种情况。1.从原点走到\(a\),再从\(a\)走到\(b\),2.从原点走到\(b\),再从\(b\)走到\(a\)。取一个最小值即可。代码int......
  • react-pdf在部分iOS手机上加载pdf失败问题解决
    最近项目快结束了,测试提了一个bug,iOS手机上加载pdf一直在转圈,加载不出来内容。看到这个bug,在电脑上和安卓手机上没有问题,iOS手机中打开确实又问题,初步确定为app问题。我们的项目是集成在客户的app里的,可能是app内的WebView和Safari有一些差异导致的问题。首先直接在iOS手机上用a......
  • 力扣-2. 两数相加(C++题解)
    题目链接:https://leetcode.cn/problems/add-two-numbers/description/给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之......
  • 关于自建Rustdesk 远程桌面服务器的公网访问:无法连接中继服务器的问题解决方法
    自建服务器位于内网时,内网客户端ID/中继的地址通常写成内网IP,外网客户端一般会用公网IP进行端口映射,但这样设置出现外网客户端无法连接中继服务器,但内网客户端使用正常的现象。经过半天的排查分析,当内网和外网填写的自定义服务器地址时,rust服务器无法识别出需要使用nat包的地址,默......
  • P1848 Bookshelf G 题解
    这是本蒟蒻写的第一篇题解(写不好请指出)很明显他是一道dp题,因为第i本书放哪里只跟前i-1本树的放法有关系。我们可以是定义f[i][j]表示放了i本书,最后一层书架是以第j本书开始的。那么有动态转移方程:\(f[i][i]=min(f[i-1][j])+hi,w[j]+...+w[i-1]<=L\)\(f[i][j]=f[i-1][j]+max(0......
  • 力扣-228. 汇总区间(C++题解)
    题目链接:https://leetcode.cn/problems/summary-ranges/description/给定一个 无重复元素的 有序整数数组\(nums\)。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,\(nums\)的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于\(......
  • P2151 [SDOI2009] HH去散步 题解
    传送门简要题意:有\(n\)个人,\(m\)条无向边,走\(e\)条边,满足条件若第\(i\)条边为\(u->v\)则第\(i+1\)条边不能是\(v->u\),问\(s->t\)的方案有多少个,取模45989。因为要满足题目关于边的条件,所以我们考虑点边互换。将\(u-v\)的无向边一分为二变成\(u->v,v->u\),第\(i\)条边记录两个变......
  • 【题解】CF1413C Perform Easily(双指针)
    【题解】CF1413CPerformEasily写篇题解水水经验~顺便增加一下RP~比较套路和简单的一道绿题。题目链接PerformEasily-洛谷|计算机科学教育新生态(luogu.com.cn)题意概述给你一个长度为\(6\)的\(a\)数组,和一个长度为\(n\)的\(b\)数组,要求将\(b\)数组内的每......
  • [CF1794E] Labeling the Tree with Distances 题解
    [CF1794E]LabelingtheTreewithDistances题解题目描述给你一个树,边权为\(1\)。给定\(n-1\)个数,你需要将这些数分配到\(n-1\)个节点上。一个点\(x\)是好的,当且仅当存在一种分配方案,所有被分配数的点到\(x\)的最短路径长度等于其被分配的数。求所有好点。思路从......