poj 1639 度限制生成树(小矮人野餐)

POJ 1639 Picnic Planning 最小度限制生成树 最小度限制生成树的求法也不是很难,先把度被限制的那个点(s点)去掉,求一次MST,然后把s到各个连通分量的最小权值的边加上,然后继续加边看看能否使生成树权减小(详见解题报告)。 立即下载
题意(参考http://www.cnblogs.com/SueMiller/archive/2011/08/10/2133871.html):矮人虽小却喜欢乘坐巨大的轿车,轿车大到可以装下无论多少矮人。某天,N个矮人打算到野外聚餐。为了集中到聚餐地点,矮人A要么开车到矮人B家中,留下自己的轿车在矮人B家,然后乘坐B的轿车同行;要么直接开车到聚餐地点,并将车停放在聚餐地。虽然矮人的家很大,可以停放无数量轿车,但是聚餐地点却最多只能停放K辆轿车。现在给定一张加权无向图,它描述了N个矮人的家和聚餐地点,要你求出所有矮人开车的最短总路程。
思路:度限制生成树。 
算法框架:
1. 先求出最小m度限制生成树;
2. 由最小m度限制生成树得到最小m+1度限制生成树;
3. 当dT(v0)=k时停止(即当V0的度为k的时候停止);

第一步:求解最小m度限制生成树:原图中去掉和V0相连的所有边,得到m个连通分量,而这m个连通分量必须通过v0来连接,所以,在图G 的所有生成树中dT(v0)≥m。也就是说,当k<m时,问题无解。对每个连通分量求一次最小生成树,对于每个连通分量V’,求一点v1,v1∈V',且ω(v0,v1)=min{ω(v0,v')|v'∈V'},则该连通分量通过边(v1,v0)与v0相连。于是,我们就得到了一个m度限制生成树,不难证明,这就是最小m度限制生成树。

第二步:由最小m度限制生成树,得到最小m+1度限制生成树,连接和V0相邻的点v,则可以知道一定会有一个环出现,只要找到这个环上的最大权边,用边(V0, v)替换掉,就可以得到一个m+1度限制生成树,枚举所有和V0相邻点v,找到替换后增加权值最小的一次替换,就可以求得m+1度限制生成树。。如果每添加一条边,都需要对环上的边一一枚举,时间复杂度将比较高,这里,动态规划就有了用武之地。设Best(v)为路径v0—v上与v0无关联且权值最大的边。定义father(v)为v的父结点,动态转移方程:Best(v)=max(Best(father(v)),ω(father(v),v)),边界条件为Best[v0]=-∞,Best[v’]=-∞| (v0,v’)∈E(T)。

第三步:当度为K的时候就可以退出了。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 30
#define INF 0x3fffffff
char name[N][12];
struct edge{
	int x,y,w;
}e[421],dis[N];//dis表示节点i到度限制点v0的距离
int n,m,res,now_d,constraind_degree,v0;
int g[N][N],tree[N][N],father[N],dis2v0[N],from[N];
void init(){
	int i,j;
	n = res = 0;
	for(i = 0;i<N;i++){
		father[i] = i;
		dis2v0[i] = INF;
	}
	for(i = 0;i<N;i++)
		for(j= 0;j<N;j++)
			g[i][j] = tree[i][j] = INF;
}
int cmp(const struct edge *a,const struct edge *b){
	return (*a).w - (*b).w;
}
int find(int x){
	if(father[x] == x)
		return x;
	return father[x] = find(father[x]);
}
int getnum(char s[12]){//n为顶点数,m为边数
	int i;
	for(i = 0;i<n;i++)
		if(!strcmp(s,name[i]))
			return i;
	strcpy(name[n],s);
	return n++;
}
void dfs(int i,int fa){//更新节点i距离v0的距离值,fa为祖先
	int j;
	if(i == fa)
		dis[i].w = 0;
	for(j = 0;j<n;j++){
		if(j==v0 || j==fa ||tree[i][j]==INF)
			continue;
		if(dis[i].w < tree[i][j]){//如果ij是圈中距离最大的边
			dis[j].w = tree[i][j];
			dis[j].x = i;
			dis[j].y = j;
		}else{//否则照搬节点i的信息
			dis[j].w = dis[i].w;
			dis[j].x = dis[i].x;
			dis[j].y = dis[i].y;
		}
		dfs(j,i);
	}
}
int main(){
	int i,j,pos,w,a,b,temp;
	char name1[12],name2[12];
	freopen("a.txt","r",stdin);
	init();
	scanf("%d",&m);
	for(i = 0;i<m;i++){//读图,边信息存入g数组
		scanf("%s %s %d",name1,name2,&w);
		a = getnum(name1);
		b = getnum(name2);
		e[i].x = a;
		e[i].y = b;
		e[i].w = w;
		g[a][b] = g[b][a] = w;
	}
	scanf("%d",&constraind_degree);
	for(i = 0;i<n;i++)//找到度限制节点,为v0
		if(!strcmp(name[i],"Park")){
			v0 = i;
			break;
		}
	qsort(e,m,sizeof(struct edge),cmp);//对边权排序,为用Kruskal求MST
	for(i = 0;i<m;i++){
		a = find(e[i].x);
		b = find(e[i].y);
		if(a!=v0 && b!=v0 && a!=b){//对删去v0的图求MST
			father[a] = b;
			res += e[i].w;
			tree[e[i].x][e[i].y] = tree[e[i].y][e[i].x] = e[i].w;
		}
	}
	for(i = 0;i<n;i++){//寻找每个连通分量中距离v0最近的点,并将其记录在from数组中
		a = find(i);
		if(g[i][v0] < dis2v0[a]){
			dis2v0[a] = g[i][v0];
			from[a] = i;
		}
	}
	for(i = 0,now_d = 0;i<n;i++)//v0向每个连通分量添加一条边,即求得k度限制生成树(k为去掉v0的连通分支个数)
		if(dis2v0[i] < INF){
			now_d ++;
			res += dis2v0[i];
			tree[from[i]][v0] = tree[v0][from[i]] = dis2v0[i];
			dfs(from[i],from[i]);//更新顶点距离v0的距离
		}
	for(i = now_d+1;i<=constraind_degree;i++){//至此求完now_d度限制MST,接下来扩展至要求的度数
		temp = 0;
		for(j = 0;j<n;j++)
			if(tree[v0][j]==INF && g[v0][j]<INF)//与v0直连但是没有选中的边
				if(g[v0][j]-dis[j].w < temp){//只有加入的边比圈中最大距离边小才有意义
					temp = g[v0][j] - dis[j].w;
					pos = j;
				}
		if(!temp)
			break;
		res += temp;
		tree[v0][pos] = tree[pos][v0] = g[v0][pos];//更新MST
		tree[dis[pos].x][dis[pos].y] = tree[dis[pos].y][dis[pos].x] = INF;
		for(j = 0;j<n;j++)//更新节点距离v0的距离信息dis
			if(tree[j][v0]<INF)
				dfs(j,j);
	}
	printf("Total miles driven: %d\n",res);
	return 0;
}


红米12C刷机避坑指南:NV数据损坏的修复与系统版本选择 本文提供了红米12C刷机过程中避免NV数据损坏的详细指南,涵盖系统版本选择、SP刷机工具使用和fastboot命令修复。重点分析了NV数据损坏的原因与表现,并给出通过工程固件和深度修复技巧解决基带未知、IMEI丢失等问题的实操方案,帮助用户安全完成刷机。 阅读详情

相关推荐

OBS技术深度剖析:从开源直播工具到专业制作引擎的进化之路

本文深入剖析了开源直播软件OBS的技术架构与发展历程。从2012年诞生至今,OBS已成长为直播领域的事实标准,其成功源于模块化设计和开源协作模式。文章详细解析了OBS的核心技术:1) 分层架构与插件系统,2) GPU加速的渲染管线,3) 智能音频处理,4) 多平台编码优化。同时探讨了虚拟摄像头、浏览器源等高级功能的实现原理,并提供了性能优化方案和硬件配置建议。随着AI、WebRTC等新技术发展,OBS将持续引领实时内容创作工具的创新,为开发者和创作者提供更强大的技术支持。

程序猿老樊的博客 325

从一次‘网段隔离’故障说起:深度拆解PVID、VLAN标签与三层网关(VLANIF)的协作机制

本文通过一次VLAN隔离失效故障案例,深入解析了PVID、VLAN标签与三层网关(VLANIF)的协作机制。文章详细介绍了故障排查步骤、数据包处理逻辑及VLANIF的核心职能,并提供了端口标准化配置和PVID安全审计等最佳实践,帮助网络工程师有效预防类似问题。

weixin_30299709的博客 550

事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域?

事件相机(Event Camera)及相关研究简介 事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~

Cyril的博客 5万+

POJ - 1639 最小限制生成树

Picnic Planning POJ - 1639最小题目大意有若干个点, m条路, 给出路的起点,终点,权值,并且有一个点的度数有限制小于等于K, 求这棵树最小的权值和是多少题目解读抽象出来就是由限制的最小生成树 限制就是某个结点的度数小于等于K 如何求解此类问题最小K度限制生成树; 具体实现步骤如下算法顺序1 首先利用kruskal 算法求出各连通分量的最小生成树权值的和,并记录有边(这

海边拾贝,沧海一粟 383

opencv图像去畸变

opencv图像去畸变

智能机器人产学研基地 4871

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

[POJ 1639]Picnic Planning

最大度限制生成树

_Horizon 525

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 268

poj 1639 Picnic Planning 度限制mst

https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但是终点只有一个,并且终点能停的车的数量是有限制的,问最少走的路是多少。 思路: 因为终点的停车的数量是有限制的,所以终点的度是有限制的,又因为这题可以用最小生成树解决,所以就是度限制最小生成树...

weixin_30247307的博客 179

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4493

PS射击游戏射线检测优化:原理、工程与全链路高性能实现

射线池:减少GC,提升批量检测效率。分层检测:先粗后细,远距离射击高效判定。批量检测:并行处理,适合大量射线场景。空间结构:进一步加速大场景检测。下面继续深入射线检测优化,补充更多实用细节和进阶技巧,包括空间分区加速、射线检测多线程/异步化、射线合并与分帧、射线池通用模板、常见性能陷阱与调优建议等。对于极端性能需求,可自定义轻量级物理系统,仅检测关键对象(如玩家、子弹),跳过复杂物理引擎。结合AABB、OBB、球体等简单碰撞体,射线-包围体检测极快。空间分区+分层检测是大场景射线优化核心。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 434

侏儒の言葉---あなたの一生に感動する「三」

人生の幸福にするためには、日常の瑣事を愛さねばならぬ。曇りの光、竹の戦ぎ、群雀の声、行人の顔---あらゆる日常の瑣事の中に無常のを感じなければならぬ。人生を幸福にするためには?--しかし、瑣事を愛するものは瑣事のために苦しまなければならぬ。庭前の小池に飛び込んだ蛙は百年の愁を破ったであろう。が、小池の飛び出した蛙は百年の愁を与えたかもしれない。いや、芭蕉の一生は享楽の一生であるとともに、誰の目にも...

hhwgaoshu的专栏 4万+

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 299

POJ --- 1639 【k度限制最小生成树】

链接题目大意:  给出m条边,每条边有两个端点和一个权值;  求这个图在满足以下条件的情况下的最小生成树;  在所有点中,有一个特殊点Park,它在求得的最小生成树中的度必须小于等于某个值; 思路: k度限制最小生成树,也就是某个顶点有度数限制的生成树。 对这道题来说是名字为Park的顶点有度数限制,最大为k,我们把这个顶点设为v0好了。 首先需要知道生成树有一个回路性质:设C为图G中的

Anxdada -- 我等风来也等你 1123

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【POJ 1639】 Picnic Planning (最小k度限制生成树)

【题意】   有n个巨人要去Park聚会。巨人A和先到巨人B那里去,然后和巨人B一起去Park。B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小。只能停k辆车。现在问你在这个限制条件下。巨人到达Park的最短距离。   如果把那个条件去掉。那么就是就是求最小生成树。加上那个条件其实就是求顶点度数限制为k的最小生成树。 Input Input will...

weixin_30673611的博客 183

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

P300-野餐计划(POJ-1639最小度限制生成树)

黑书上的例题,具体模型是求一个无向图的最小生成树,其中有一个点的度有限制(假设为 k)。   要求最小 k 度生成树,我们可以按照下面的步骤来做: 设有度限制的点为 V0 ,V0称为根节点 1,把所有与 V0 相连的边删去,图会分成多个子图(假设为 m 个,显然的,如果 m > k,那么问题无解),让他们分别求最小生成树;然后用最小的代价将 m 个最小生成树和 V0 连起来,那我们就得到了

famousDT的专栏 1009

#最小生成树#poj 1639 Picnic Planning

题目 一个n个点m条边的无向图,求它的最小生成树,且满足1号节点的度数不超过给定的整数 分析 那么把这个最小生成树拆开,分成了许多连通块,在这些连通块中找到子最小生成树,然后再深搜尝试用其它点连向一号节点 代码 #include &amp;lt;iostream&amp;gt; #include &amp;lt;map&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;l

lemondinosaur的博客 315

【poj1639】求最小度限制生成树

话说这题的解题方式和代码还是不太理解,数据太弱以至于枚举k个点分别进行prim最小生成树,最后取最优值也能过。 简单说说最小限制生成树的理解。 首先明白几个定义: 最小生成树:在一个带权图中用最小的权值和将所有的点连接起来。 最小限制生成树:在图中指定某个点为定点,要求所生成的最小生成树中这个定点的度不能超过k。 解法: 首先不考虑k,我们只考虑小于k的某个值p,假设现在生成的树中定点...

weixin_34143774的博客 197

poj1639

有n个巨人要去Park聚会。巨人A和先到巨人B那里去,然后和巨人B一起去Park。B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小。只能停k辆车。现在问你在这个限制条件下。居然到达Park的最短距离-------------------------------------------------------------------------------------分割线...

weixin_30828379的博客 204

poj 1639 Picnic Planning(最小K度限制生成树)

hihoCoder挑战赛11来啦!有Tshirt作为奖品哦~ Language: Default Picnic Planning Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9563   Accepted: 3427 Descript

youngkl博客 847

poj 1639

<br />       经典的顶点度数限制为K的最小生成树。我是靠模版做出来的。这题的详细解法建议看黑书的生成树那章的相关内容。这里引用czyuan神的做法吧,我的模版就是那里来的。。。。。<br /> <br /><br />具体步骤:(算法的证明可以参照lrj的《算法艺术和

Yular的专栏 2376

poj1639(最小K度生成树)

即最小k+1度限制生成树属于最小k度限制生成树的邻集。 既然知道了最小k度限制生成树,求解最小k+1度限制生成树的步骤: 方法一:枚举法 (1)可知最小k+1度限制生成树属于最小k度限制生成树,因此可以通过枚举最小k度限制生成树上的一次可行解。 (2)为了使V0的度增加,枚举的可行解中必须有一条边与V0关联。 (3)假设我们已经得到了一棵最小生成树。 (4)现在枚举V0关联且不在树上边,分别添加到树上。 (5)添加边之后,会形成环,则删除边的权值越大的,所得到的生成树的权值和就越小,因此需要删除权值最大的边

Keep_Trying_Go的博客 601

poj1639最小度限制生成树(kruscal+邻接表)

一、.思路 设限制结点为des.  1. 求去掉des的最小生成树,此时求出来的是最小生成森林  2.添加des到各连通分量的边,当然取最小的边。  3.此时得到m度的生成树,我们要求的是小于等于k度的最小生成树,此时我们可以用来调整的边只有k-m条, 注意我们不一定要

ysjjovo的专栏 755

poj 1639 Picnic Planning(限制入度最小生成树)

poj 1639 Picnic Planning(限制入度最小生成树)

越看越喜欢啊 878

Picnic Planning POJ - 1639 限制顶点度数的MST

题意:有n个兄弟去野餐,目的地为Park。每个人可以选择直接去Park,也可以选择去其他人家,和他一起坐车去Park。每个人家的停车位没有限制,但是Park的停车数不能超过k。问所有人的最短路程。思路 上手可能觉得题目很难,但是分解一下就会发现很简单. ①根节点的度有限制的生成树或许不好写,但度最小的生成树却很简单. ②有一种方法可以 将根节点度为i的最小生成树变成成i+1的MST 方法如下

yanga11ang的博客 398

【胡诌学习笔记】某种反悔贪心

完了这篇文章越改越恶心果然以我的水平还是擅长胡诌啊……

七代目鸽影 421

树莓派之Debian游戏(部分)

注:该内容为机翻,难免有翻译错误内容 这些游戏可以在树莓派自带的软件商店里找到并下载、安装 1.0ad(古代战争的实时战略游戏) 是一个自由、开源、跨平台的古代战争实时策略游戏。简而言之,它是一款基于历史的战争/经济游戏,允许游戏者再体验或改写西方文明史,时间跨度为公元前 500年至公元500年。该项目雄心勃勃,包括最先进的3D图像,细致的插图,声音,以及灵活强大的可定制游戏引擎。 2.2048-qt (基于数学的益智游戏) 是基于数学的解谜游戏,你需要在一个格子棋盘上滑动滑块,将其组合并创建数字 2

唐剑仙的博客 1万+
上一篇: poj 1637 混合图欧拉回路(城市观光)
下一篇: sgu 102 欧拉函数(poj 2407)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值