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)可以跳跃到结点 ...
随机推荐
- java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符
###21.01_IO流(字符流FileReader) * 1.字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...
- python:用wordcloud生成一个文本的词云
今天学习了wordcloud库,对<三国演义>生成了词云图片,非常漂亮.就想多尝试几个,结果发现一系列问题.最常出现的一个错误就是"UnicodeDecodeError : .. ...
- python中的列表的嵌套与转换
第一种方法:这行代码的for循环的意识,是先将matrix列表中的每行的第一个元素拿出. matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]] transposed_r ...
- Python服务Dokcer化并k8s部署实例
这篇文章记录了我试验将一个基于python的服务docker化并k8s部署的过程. 服务介绍Docker化设计业务代码改造创建docker镜像K8S部署设计yaml文件运行服务介绍这是一个用 pyth ...
- PythonStudy——文件操作习题 Document operation exercises
# 1.统计文件数据中字母e出现的次数(不区分大小写)# 文件内容:hello friend, can you speak English!# 结果:4# 分析:将文件内容读出,然后统计读出的字符串中 ...
- lsof一些使用
查看某进程和哪些文件相关 [root@linux-node2 ~]# netstat -lntp Active Internet connections (only servers) Proto Re ...
- Jenkins 配置 FindBugs,Checkstyle,PMD 实现代码的静态检查 (14)
一.插件介绍 FindBugs:静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.利用这个工具,就可以在不实际运行程序的情况对软件进行分析.它可以帮助改进代码的 ...
- [ExcelHome]VLOOKUP的别样用法
请看题: 如上图所示,是某小区多名业主的信息表.如诸君所见,A列是业主的姓名,B列是一些有趣的信息,要求在C列,使用VLOOKUP函数,提取出B列的手机号码. B列的信息真是奇葩,除了手机号码,还有职 ...
- DeepLearning初窥门径
说明: 最近在看Ng的DL课程,感觉说的非常好,浅显易懂! 本来打算记录一下自己的学习过程,网上几个大神总结的太完美了,根本没必要自己去写了,而且浪费时间~~ 网易地址:http://mooc.stu ...
- Unable to complete the scan for annotations for web application [/wrs] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies.
tomcat启动报错:Jul 20, 2018 11:48:37 AM org.apache.catalina.core.ContainerBase addChildInternalSEVERE: C ...