题目链接:https://vjudge.net/problem

题意:

给各位看一下题意,算法详解看下面大佬博客吧,写的很好。

参考博客:最小k度限制生成树 - chty - 博客园  https://www.cnblogs.com/chty/p/5934669.html

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<map>
  6. #include<stack>
  7. #include<cmath>
  8. #include<vector>
  9. #include<set>
  10. #include<cstdio>
  11. #include<string>
  12. #include<deque>
  13. using namespace std;
  14. typedef long long LL;
  15. #define eps 1e-8
  16. #define INF 0xffffff
  17. #define maxn 105
  18. map<string,int>mp;
  19. struct node{
  20. int u,v,w,next;
  21. }edge[maxn*maxn],dp[maxn];
  22. int n,m,k,t,id,cnt;
  23. int sum,md;//边权和,最小的度
  24. int pre[maxn],check[maxn][maxn],dis[maxn][maxn],minn[maxn],temp[maxn];
  25. //集合的祖先,check[i][j]表示在生成树里面i和j是否有边相连,dis[i][j]表示i和j之间的边权
  26. //minn[i]表示以点i为祖先节点的点集里和树根直接相连的最小边权,temp记录这个点的下标
  27. void init(){
  28. id=;
  29. sum=md=;
  30. memset(check,,sizeof(check));
  31. ;i<maxn;i++){
  32. ;j<maxn;j++){
  33. dis[i][j]=INF;
  34. }
  35. }
  36. ;i<maxn;i++)
  37. pre[i]=i;
  38. }
  39. void read(){
  40. init();
  41. cin>>m;
  42. string u,v;
  43. int w;
  44. mp[;
  45. ;i<=m;i++){
  46. cin>>u>>v>>w;
  47. )
  48. mp[u]=++id;
  49. )
  50. mp[v]=++id;
  51. edge[i].u=mp[u];
  52. edge[i].v=mp[v];
  53. edge[i].w=w;
  54. dis[mp[u]][mp[v]]=dis[mp[v]][mp[u]]=min(dis[mp[u]][mp[v]],w);
  55. }
  56. cin>>k;
  57. }
  58. bool cmp(node a,node b){
  59. return a.w<b.w;
  60. }
  61. int find(int a){
  62. return pre[a]==a?a:pre[a]=find(pre[a]);
  63. }
  64. void cal_m_tree(){//计算度为m的最小生成树
  65. sort(edge+,edge++m,cmp);
  66. ;i<=m;i++){
  67. int u=edge[i].u;
  68. int v=edge[i].v;
  69. int w=edge[i].w;
  70. ||v==)
  71. continue;
  72. int x=find(u);
  73. int y=find(v);
  74. if(x!=y){
  75. pre[x]=y;
  76. sum+=w;//把边权加上
  77. check[u][v]=check[v][u]=;//标记链接u,v的边已经走过
  78. }
  79. }
  80. ;i<=id;i++)
  81. minn[i]=INF;
  82. ;i<=id;i++){//寻找各个连通块里面和树根直接相连的最小边
  83. int f=find(i);
  84. ]!=INF&&minn[f]>dis[i][]){//更新连通快f的值并记录点的下标
  85. minn[f]=dis[i][];//
  86. temp[f]=i;
  87. }
  88. }
  89. ;i<=id;i++){
  90. if(minn[i]!=INF){
  91. md++;//度增加
  92. sum+=minn[i];//权值增加
  93. check[][temp[i]]=check[temp[i]][]=;//标记边
  94. }
  95. }
  96. }
  97. void DFS(int u,int fa){//用动态规划来计算从树根到生成树上每一个点的1路径上面的最大边权
  98. //同时记录这条边所连接的两点
  99. ;i<=id;i++){
  100. if(i==fa)
  101. continue;
  102. ){//动态规划,到点i的最大边权dp[i].w=max{dp[u].w,dis[i][u]}
  103. ){
  104. dp[i].w=dis[i][u];
  105. dp[i].u=u;
  106. dp[i].v=i;
  107. }
  108. else{
  109. dp[i]=dp[u];
  110. }
  111. DFS(i,u);
  112. }
  113.  
  114. }
  115. }
  116. void cal_k_tree(){//计算度为m+1到k的最小生成树,可以直接跳出
  117. ;i<=k;i++){
  118. ;j<=id;j++)
  119. dp[j].w=-INF;
  120. DFS(,-);
  121. int ans=INF,u;//ans记录接下来度为i的生成树和之前生成树的权值之差的最小值,如果ans<0,说明还可以
  122. //使边权变小,否则在度数增加时边权和只会变大,所以可以直接跳出
  123. ;j<=id;j++){
  124. ]==&&dis[][j]!=INF){
  125. ][j]-dp[j].w){
  126. ans=dis[][j]-dp[j].w;
  127. u=j;
  128. }
  129. }
  130. }
  131. )//无法增广,直接跳出
  132. break;
  133. int a=dp[u].u;
  134. int b=dp[u].v;
  135. check[a][b]=check[b][a]=;//去掉一条边
  136. check[][u]=check[u][]=;//增加一条边
  137. sum+=ans;//边权减少
  138. }
  139. }
  140. int main()
  141. {
  142. read();
  143. cal_m_tree();
  144. cal_k_tree();
  145. printf("Total miles driven: %d\n",sum);
  146. ;
  147. }

poj 1639 最小k度限制生成树的更多相关文章

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

    [题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...

  2. 最小k度限制生成树

    [题目描述] 给你一个图,n个点,m条边,求一颗生成树满足如下条件: (1)结点1的度不超过k. (2)在(1)条件下所求生成树最小. [算法引入] 最小k度限制生成树,就是指有特殊的某一点的度不能超 ...

  3. poj1639 Picnic Planning,K度限制生成树

    题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...

  4. poj 1639 Picnic Planning 度限制mst

    https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...

  5. 最小k度最小生成树模板

    代码是抄的 题解是瞄的 可我想学习的心是真的嘤嘤嘤 然而 还是上传一份ioi大神的论文吧 链接:https://pan.baidu.com/s/1neIW9QeZEa0hXsUqJTjmeQ 密码:b ...

  6. Picnic Planning POJ - 1639(最小k度生成树)

    The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible abil ...

  7. K度限制MST poj 1639

    /* k度限制MST:有一个点的度<=k的MST poj 1639 要求1号点的度不超过k 求MST 我们先把1号点扔掉 跑MST 假设有sum个连通分支 然后把这sum个分支连到1上 就得到了 ...

  8. POJ 1639 Picnic Planning:最小度限制生成树

    题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...

  9. HDU 4862 Jump(最小K路径覆盖)

    输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...

随机推荐

  1. Office常用技巧

    文章目录 大小写切换 把word里的自动编号转换为真实的文本 大小写切换 word中修改单词/句子的大小写:选中文字,按shift+F3,可在全大写.全小写.首字符大写间切换. 把word里的自动编号 ...

  2. ASP.NET资源大全-知识分享 【转载】

    API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...

  3. JDK 8 安装及配置

    1.配置java环境变量 注意:jdk文件夹名字取名不要用汉语取名. 1)鼠标右键点击我的电脑(计算机)选择属性栏 2)再点击左边高级系统设置 3)点击环境变量 4)在用户变量窗口新建变量名为JAVA ...

  4. bootstrap modal 移除数据

    有时业务需求,在弹出模态框时需要动态的展示,但是不做处理时,每次弹出的都是第一次的数据,所以需要监听模态框关闭,每次关闭需要先清除里面的数据. //监听弹页关闭 $("#myModal&qu ...

  5. Java面试题 corejava(二)

    65.JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try 块中可以抛出异常吗?[基础] 答:Java 通过面向对象的方法进行 ...

  6. spark submit参数调优

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

  7. NumPy-快速处理数据--ndarray对象--数组的创建和存取

    本文摘自<用Python做科学计算>,版权归原作者所有. NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了 ...

  8. onOptionsItemSelected、onMenuItemSelected、onContextItemSelected 区别

         1.在点击选项菜单(OptionsMenu:点击menu弹出的菜单)的菜单项时即调用了onMenuItemSelected 也调用了onOptionsItemSelected ,于是疑惑他们 ...

  9. python:数据类型list

    一.列表list list是python中基础的数据类型之一,它是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型 li = ['alex', 123, True, (1, 2, 3 ...

  10. c# HashTable (哈希表)

    HashTable 哈希表 也是System.Collections集合下的数据结构类 它储存的也是Object类型的对象 但是它在内存中是散列排布的 因为这个特性,非常适合存储大量的数据 在Hash ...