poj 1639 最小k度限制生成树
题目链接:https://vjudge.net/problem
题意:
给各位看一下题意,算法详解看下面大佬博客吧,写的很好。
参考博客:最小k度限制生成树 - chty - 博客园 https://www.cnblogs.com/chty/p/5934669.html
代码:
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<map>
- #include<stack>
- #include<cmath>
- #include<vector>
- #include<set>
- #include<cstdio>
- #include<string>
- #include<deque>
- using namespace std;
- typedef long long LL;
- #define eps 1e-8
- #define INF 0xffffff
- #define maxn 105
- map<string,int>mp;
- struct node{
- int u,v,w,next;
- }edge[maxn*maxn],dp[maxn];
- int n,m,k,t,id,cnt;
- int sum,md;//边权和,最小的度
- int pre[maxn],check[maxn][maxn],dis[maxn][maxn],minn[maxn],temp[maxn];
- //集合的祖先,check[i][j]表示在生成树里面i和j是否有边相连,dis[i][j]表示i和j之间的边权
- //minn[i]表示以点i为祖先节点的点集里和树根直接相连的最小边权,temp记录这个点的下标
- void init(){
- id=;
- sum=md=;
- memset(check,,sizeof(check));
- ;i<maxn;i++){
- ;j<maxn;j++){
- dis[i][j]=INF;
- }
- }
- ;i<maxn;i++)
- pre[i]=i;
- }
- void read(){
- init();
- cin>>m;
- string u,v;
- int w;
- mp[;
- ;i<=m;i++){
- cin>>u>>v>>w;
- )
- mp[u]=++id;
- )
- mp[v]=++id;
- edge[i].u=mp[u];
- edge[i].v=mp[v];
- edge[i].w=w;
- dis[mp[u]][mp[v]]=dis[mp[v]][mp[u]]=min(dis[mp[u]][mp[v]],w);
- }
- cin>>k;
- }
- bool cmp(node a,node b){
- return a.w<b.w;
- }
- int find(int a){
- return pre[a]==a?a:pre[a]=find(pre[a]);
- }
- void cal_m_tree(){//计算度为m的最小生成树
- sort(edge+,edge++m,cmp);
- ;i<=m;i++){
- int u=edge[i].u;
- int v=edge[i].v;
- int w=edge[i].w;
- ||v==)
- continue;
- int x=find(u);
- int y=find(v);
- if(x!=y){
- pre[x]=y;
- sum+=w;//把边权加上
- check[u][v]=check[v][u]=;//标记链接u,v的边已经走过
- }
- }
- ;i<=id;i++)
- minn[i]=INF;
- ;i<=id;i++){//寻找各个连通块里面和树根直接相连的最小边
- int f=find(i);
- ]!=INF&&minn[f]>dis[i][]){//更新连通快f的值并记录点的下标
- minn[f]=dis[i][];//
- temp[f]=i;
- }
- }
- ;i<=id;i++){
- if(minn[i]!=INF){
- md++;//度增加
- sum+=minn[i];//权值增加
- check[][temp[i]]=check[temp[i]][]=;//标记边
- }
- }
- }
- void DFS(int u,int fa){//用动态规划来计算从树根到生成树上每一个点的1路径上面的最大边权
- //同时记录这条边所连接的两点
- ;i<=id;i++){
- if(i==fa)
- continue;
- ){//动态规划,到点i的最大边权dp[i].w=max{dp[u].w,dis[i][u]}
- ){
- dp[i].w=dis[i][u];
- dp[i].u=u;
- dp[i].v=i;
- }
- else{
- dp[i]=dp[u];
- }
- DFS(i,u);
- }
- }
- }
- void cal_k_tree(){//计算度为m+1到k的最小生成树,可以直接跳出
- ;i<=k;i++){
- ;j<=id;j++)
- dp[j].w=-INF;
- DFS(,-);
- int ans=INF,u;//ans记录接下来度为i的生成树和之前生成树的权值之差的最小值,如果ans<0,说明还可以
- //使边权变小,否则在度数增加时边权和只会变大,所以可以直接跳出
- ;j<=id;j++){
- ]==&&dis[][j]!=INF){
- ][j]-dp[j].w){
- ans=dis[][j]-dp[j].w;
- u=j;
- }
- }
- }
- )//无法增广,直接跳出
- break;
- int a=dp[u].u;
- int b=dp[u].v;
- check[a][b]=check[b][a]=;//去掉一条边
- check[][u]=check[u][]=;//增加一条边
- sum+=ans;//边权减少
- }
- }
- int main()
- {
- read();
- cal_m_tree();
- cal_k_tree();
- printf("Total miles driven: %d\n",sum);
- ;
- }
poj 1639 最小k度限制生成树的更多相关文章
- 【POJ 1639】 Picnic Planning (最小k度限制生成树)
[题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...
- 最小k度限制生成树
[题目描述] 给你一个图,n个点,m条边,求一颗生成树满足如下条件: (1)结点1的度不超过k. (2)在(1)条件下所求生成树最小. [算法引入] 最小k度限制生成树,就是指有特殊的某一点的度不能超 ...
- poj1639 Picnic Planning,K度限制生成树
题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...
- poj 1639 Picnic Planning 度限制mst
https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...
- 最小k度最小生成树模板
代码是抄的 题解是瞄的 可我想学习的心是真的嘤嘤嘤 然而 还是上传一份ioi大神的论文吧 链接:https://pan.baidu.com/s/1neIW9QeZEa0hXsUqJTjmeQ 密码:b ...
- Picnic Planning POJ - 1639(最小k度生成树)
The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible abil ...
- K度限制MST poj 1639
/* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...
- POJ 1639 Picnic Planning:最小度限制生成树
题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...
- HDU 4862 Jump(最小K路径覆盖)
输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...
随机推荐
- Office常用技巧
文章目录 大小写切换 把word里的自动编号转换为真实的文本 大小写切换 word中修改单词/句子的大小写:选中文字,按shift+F3,可在全大写.全小写.首字符大写间切换. 把word里的自动编号 ...
- ASP.NET资源大全-知识分享 【转载】
API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...
- JDK 8 安装及配置
1.配置java环境变量 注意:jdk文件夹名字取名不要用汉语取名. 1)鼠标右键点击我的电脑(计算机)选择属性栏 2)再点击左边高级系统设置 3)点击环境变量 4)在用户变量窗口新建变量名为JAVA ...
- bootstrap modal 移除数据
有时业务需求,在弹出模态框时需要动态的展示,但是不做处理时,每次弹出的都是第一次的数据,所以需要监听模态框关闭,每次关闭需要先清除里面的数据. //监听弹页关闭 $("#myModal&qu ...
- Java面试题 corejava(二)
65.JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try 块中可以抛出异常吗?[基础] 答:Java 通过面向对象的方法进行 ...
- spark submit参数调优
在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...
- NumPy-快速处理数据--ndarray对象--数组的创建和存取
本文摘自<用Python做科学计算>,版权归原作者所有. NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了 ...
- onOptionsItemSelected、onMenuItemSelected、onContextItemSelected 区别
1.在点击选项菜单(OptionsMenu:点击menu弹出的菜单)的菜单项时即调用了onMenuItemSelected 也调用了onOptionsItemSelected ,于是疑惑他们 ...
- python:数据类型list
一.列表list list是python中基础的数据类型之一,它是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型 li = ['alex', 123, True, (1, 2, 3 ...
- c# HashTable (哈希表)
HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性,非常适合存储大量的数据 在Hash ...