1. /*
  2. k度限制MST:有一个点的度<=k的MST
  3. poj 1639
  4. 要求1号点的度不超过k 求MST
  5. 我们先把1号点扔掉 跑MST
  6. 假设有sum个连通分支 然后把这sum个分支连到1上
  7. 就得到了一个sum度的MST
  8. 这里往上连的时候 我们连这个分支里 距离1最近的
  9. 然后我们在1上加一条边 (即加一个度)得到sum+1度的MST
  10. 这里加边的时候 1连出去的每一条边都试一遍 取最小
  11. 假设当前1连到了 i 因为原来是个树 这样一搞就形成一个环
  12. 我们现在要删去环里面最长边 来得到更小的ans
  13. 我么维护dp[x]代表x到1的路径上权值最大的边的信息
  14. (不包含与1直接相连的边否则删去1的度减1 并不能得到sum+1度的MST)
  15. 关键就是维护这个dp[x]
  16. 每次找sum+i度的MST之前我们从1dp一遍维护到每个点的max(沿着sum+i-1度的MST)
  17. 在树上跑 复杂度就降下来了On可以搞完
  18. 方程是 dp[x]=max(dp[from],G[from][x])
  19. 当新填的边不比找到的max边大的时候停下
  20. */
  21. #include<cstdio>
  22. #include<iostream>
  23. #include<cstring>
  24. #include<algorithm>
  25. #include<map>
  26. #define maxn 110
  27. using namespace std;
  28. int n,m,k,num,G[maxn][maxn],vis[maxn][maxn],ans,mt[maxn],wh[maxn],sum,fa[maxn];
  29. map<string,int>f;
  30. struct node{
  31. int u,v,t;
  32. }e[maxn*maxn],dp[maxn*maxn];
  33. int cmp(const node &A,const node &B){
  34. return A.t<B.t;
  35. }
  36. void Add(int from,int to,int dis){
  37. num++;e[num].v=to;
  38. e[num].u=from;
  39. e[num].t=dis;
  40. }
  41. int find(int x){
  42. return x==fa[x]?x:fa[x]=find(fa[x]);
  43. }
  44. void Dfs(int now,int from){
  45. for(int i=;i<=n;i++){
  46. if(i==from)continue;
  47. if(vis[now][i]){
  48. if(dp[i].t!=-){
  49. if(dp[now].t<G[now][i]){
  50. dp[i].t=G[now][i];
  51. dp[i].u=now;dp[i].v=i;
  52. }
  53. else dp[i]=dp[now];
  54. }
  55. Dfs(i,now);
  56. }
  57. }
  58. }
  59. void Kur(){
  60. sort(e+,e++num,cmp);
  61. for(int i=;i<=n;i++)fa[i]=i;
  62. for(int i=;i<=m;i++){
  63. if(e[i].u==||e[i].v==)continue;
  64. if(find(e[i].u)==find(e[i].v))continue;
  65. ans+=e[i].t;fa[find(e[i].u)]=find(e[i].v);
  66. vis[e[i].u][e[i].v]=vis[e[i].v][e[i].u]=;
  67. }
  68. }
  69. int main(){
  70. scanf("%d",&m);f["Park"]=++n;
  71. string A,B;int t;
  72. memset(G,-,sizeof(G));
  73. for(int i=;i<=m;i++){
  74. cin>>A>>B>>t;
  75. if(f[A]==)f[A]=++n;if(f[B]==)f[B]=++n;
  76. Add(f[A],f[B],t);
  77. if(G[f[A]][f[B]]==-)G[f[A]][f[B]]=G[f[B]][f[A]]=t;
  78. else G[f[A]][f[B]]=G[f[B]][f[A]]=min(t,G[f[A]][f[B]]);
  79. }
  80. scanf("%d",&k);
  81. Kur();memset(mt,/,sizeof(mt));
  82. for(int i=;i<=n;i++){
  83. if(G[][i]!=-){
  84. int r=find(i);
  85. if(G[][i]<mt[r]){
  86. mt[r]=G[][i];
  87. wh[r]=i;
  88. }
  89. }
  90. }
  91. for(int i=;i<=n;i++)
  92. if(mt[i]!=mt[]){
  93. sum++;ans+=G[][wh[i]];
  94. vis[][wh[i]]=vis[wh[i]][]=;
  95. }
  96. //得到最小sum度树
  97. for(int i=sum+;i<=k;i++){
  98. dp[].t=-;
  99. for(int j=;j<=n;j++){
  100. if(vis[][j])dp[i].t=-;
  101. else dp[i].t=;
  102. }
  103. Dfs(,-);
  104. int pos,mii=1e9;
  105. for(int j=;j<=n;j++){
  106. if(G[][j]==-)continue;
  107. if(mii>G[][j]-dp[j].t){
  108. pos=j;mii=G[][j]-dp[j].t;
  109. }
  110. }
  111. if(mii>=)break;
  112. vis[][pos]=vis[pos][]=;
  113. vis[dp[pos].u][dp[pos].v]=;
  114. vis[dp[pos].v][dp[pos].u]=;
  115. ans+=mii;
  116. }
  117. printf("Total miles driven: %d\n",ans);
  118. return ;
  119. }

K度限制MST poj 1639的更多相关文章

  1. 度限制最小生成树 POJ 1639 贪心+DFS+prim

    很好的解题报告: http://blog.csdn.net/new_c_yuer/article/details/6365689 注意两点: 1.预处理环中权值最大的边···· 2.可以把去掉度限制后 ...

  2. K - The Unique MST - poj 1679

    题目的意思已经说明了一切,次小生成树... ****************************************************************************** ...

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

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

  4. poj 1639 Picnic Planning 度限制mst

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

  5. poj 1639 最小k度限制生成树

    题目链接:https://vjudge.net/problem 题意: 给各位看一下题意,算法详解看下面大佬博客吧,写的很好. 参考博客:最小k度限制生成树 - chty - 博客园  https:/ ...

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

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

  7. 最小k度限制生成树

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

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

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

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

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

随机推荐

  1. Ubuntu 系统的常用快捷键

    Ubuntu操作基本快捷键 ibus-setup :设置系统输入法 scp filename username@serverIp:/home/xxx/xxx/filename   回车输入该usern ...

  2. vue杂记

    VUE杂记 声明式渲染 <div id="app"> {{ message }} </div> var app = new Vue({ el: '#app' ...

  3. Android基于HttpUrlConnection类的文件下载

    /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param pat ...

  4. CommandBehavior.CloseConnection使用

    其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...

  5. JS——思维拓展

    1.阶乘求和:4的阶乘是1*2*3*4 <script> function jiechen(value) { var n = 1; for (var i = 1; i <= valu ...

  6. 转载:使用FileReader对象的readAsDataURL方法来读取图像文件

    文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...

  7. 【译】x86程序员手册01

    Intel 80386 Reference Programmer's Manual 80386程序员参考手册 Chapter 1 -- Introduction to the 80386 第1章 - ...

  8. 3星|《商业周刊中文版:2017商业人物(下)》:酒店才应该是出行住宿的最佳选择,Airbnb不是

    商业周刊/中文版:2017商业人物(下) 对一些知名商业人物的访谈的合辑. 总体评价3星,有一些参考价值. 以下是本期一些内容的摘抄: 1:段永平是一位隐秘的亿万富豪,去年,他创立的智能手机姊妹品牌O ...

  9. RHEL7配置中文输入法-智能拼音

    RHEL7配置中文输入法-智能拼音 RHEL7.x(CentOS7.x)系统相对之前的6.x系统变化较大,虽然安装时选择了中文环境,但是进入系统后,在控制台及编辑器中仍无法切换输入法进行中文输入. 原 ...

  10. 用C#在Visual Studio写Javascript单元测试

    1.在vs创建一个标准的单元测试工程 2.引用nuget包:Edge.js 我是用的是6.11.2版本 3.编写JsRunner类 using EdgeJs; using System; using ...