代码是抄的

题解是瞄的

可我想学习的心是真的嘤嘤嘤

然而

还是上传一份ioi大神的论文吧

链接:https://pan.baidu.com/s/1neIW9QeZEa0hXsUqJTjmeQ

密码:blr4

代码如下

  1. #include <map>
  2. #include <set>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <stack>
  6. #include <queue>
  7. #include <cstdio>
  8. #include <cctype>
  9. #include <bitset>
  10. #include <string>
  11. #include <vector>
  12. #include <cstring>
  13. #include <iostream>
  14. #include <algorithm>
  15. #include <functional>
  16. #define fuck(x) cout<<"["<<x<<"]";
  17. #define FIN freopen("input.txt","r",stdin);
  18. #define FOUT freopen("output.txt","w+",stdout);
  19. //#pragma comment(linker, "/STACK:102400000,102400000")
  20.  
  21. const int INF = 0x3f3f3f3f;
  22. const int maxn = ;
  23.  
  24. using namespace std;
  25.  
  26. struct Edge{
  27. int u, v, d;
  28. Edge() {}
  29. Edge(int a, int b, int c) : u(a), v(b), d(c) {}
  30. bool operator < (const Edge &e) const {
  31. return d < e.d;
  32. }
  33. };
  34.  
  35. int n, m, k;
  36. int cnt;
  37. int ans;
  38. int f[maxn]; // 并查集
  39. map<string, int> nodes;
  40. vector<Edge> edges;
  41. Edge dp[maxn];
  42. int g[maxn][maxn];
  43. bool tree[maxn][maxn]; // tree[i][j]=true表示<i, j>这条边在最小生成树中
  44. int minEdge[maxn];
  45.  
  46. int find(int p) {
  47. if (p == f[p]) return f[p];
  48. return f[p] = find(f[p]);
  49. }
  50.  
  51. void unite(int p, int q) {
  52. f[find(p)] = find(q);
  53. }
  54.  
  55. void kruskal() {
  56. sort(edges.begin(), edges.end());
  57. for (int i = ; i < edges.size(); i++) {
  58. int p = edges[i].u;
  59. int q = edges[i].v;
  60. if (p == || q == ) continue; // 忽略根节点
  61. if (find(p) != find(q)) {
  62. unite(p, q);
  63. tree[p][q] = tree[q][p] = ;
  64. ans += edges[i].d;
  65. }
  66. }
  67. }
  68.  
  69. void dfs(int cur, int pre) {
  70. for (int i = ; i <= cnt; i++) {
  71. if (i == pre || !tree[cur][i]) continue;
  72. if (dp[i].d == -) {
  73. if (dp[cur].d > g[cur][i]) dp[i] = dp[cur];
  74. else {
  75. dp[i].u = cur;
  76. dp[i].v = i;
  77. dp[i].d = g[cur][i];
  78. }
  79. }
  80. dfs(i, cur);
  81. }
  82. }
  83.  
  84. void solve() {
  85. int keyPoint[maxn];
  86. for (int i = ; i <= cnt; i++) {
  87. if (g[][i] != INF) {
  88. // 点i在哪颗最小生成树中
  89. int color = find(i);
  90. // 每颗最小生成树中距离根节点最近的点与根节点的距离
  91. if (minEdge[color] > g[][i]) {
  92. minEdge[color] = g[][i];
  93. keyPoint[color] = i;
  94. }
  95. }
  96. }
  97. for (int i = ; i <= cnt; i++) {
  98. if (minEdge[i] != INF) {
  99. m++;
  100. tree[][keyPoint[i]] = tree[keyPoint[i]][] = ;
  101. ans += g[][keyPoint[i]];
  102. }
  103. }
  104. // 由i-1度生成树得i度生成树
  105. for (int i = m + ; i <= k; i++) {
  106. memset(dp, -, sizeof(dp));
  107. dp[].d = -INF;
  108. for (int j = ; j <= cnt; j++)
  109. if (tree[][j]) dp[j].d = -INF;
  110. dfs(, -); // dp预处理
  111. int idx, minnum = INF;
  112. for (int j = ; j <= cnt; j++) {
  113. if (minnum > g[][j] - dp[j].d) {
  114. minnum = g[][j] - dp[j].d;
  115. idx = j;
  116. }
  117. }
  118. if (minnum >= ) break;
  119. tree[][idx] = tree[idx][] = ;
  120. tree[dp[idx].u][dp[idx].v] = tree[dp[idx].v][dp[idx].u] = ;
  121. ans += minnum;
  122. }
  123. }
  124.  
  125. void init() {
  126. memset(g, 0x3f, sizeof(g));
  127. memset(tree, , sizeof(tree));
  128. memset(minEdge, 0x3f, sizeof(minEdge));
  129. m = ;
  130. cnt = ;
  131. ans = ;
  132. nodes["Park"] = ;
  133. for (int i = ; i < maxn; i++)
  134. f[i] = i;
  135. }
  136.  
  137. int main() {
  138. #ifndef ONLINE_JUDGE
  139. FIN
  140. #endif
  141. scanf("%d", &n);
  142. string s1, s2;
  143. int d;
  144. init();
  145. for (int i = ; i <= n; i++) {
  146. cin >> s1 >> s2 >> d;
  147. if (!nodes[s1]) nodes[s1] = ++cnt;
  148. if (!nodes[s2]) nodes[s2] = ++cnt;
  149. int u = nodes[s1], v = nodes[s2];
  150. edges.push_back(Edge(u, v, d));
  151. g[u][v] = g[v][u] = min(g[u][v], d);
  152. }
  153. scanf("%d", &k);
  154. kruskal(); // 忽略根节点先计算一次最小生成树,此时得到一个森林
  155. solve();
  156. printf("Total miles driven: %d\n", ans);
  157. return ;
  158. }

最小k度最小生成树模板的更多相关文章

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

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

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

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

  3. 最小k度限制生成树

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

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

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

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

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

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

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

  7. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  8. poj 1258 最小生成树 模板

    POJ 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #in ...

  9. K度限制MST poj 1639

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

随机推荐

  1. Leecode刷题之旅-C语言/python-53.最大子序和

    /* * @lc app=leetcode.cn id=53 lang=c * * [53] 最大子序和 * * https://leetcode-cn.com/problems/maximum-su ...

  2. 素数环 南阳acm488(回溯法)

    素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简 ...

  3. 算法竞赛入门经典-1.5.4 Q&A

    这小节考察实践能力,要求在不要查书.不要网上找答案,自己用实验的方法解决以下五个问题: 做这五道题时,好几道都没思路,违反了规则到网上找了一圈,居然没找到答案,于是打算写这篇博客.不知是否有更好的实践 ...

  4. IO复用——select系统调用

    1.select函数 此函数用于在一段时间内,监听用户感兴趣的文件描述符上的可读.可写和异常等事件. #include<sys/select.h> int select(int nfds, ...

  5. Python3全栈学习目录

    http://www.cnblogs.com/wupeiqi/articles/4938499.html 文辉整理: http://blog.51cto.com/9272317/1869914

  6. 基于阿里云服务器Linux系统部署JavaWeb项目

    前段时间刚完成一个JavaWeb项目,想着怎么部署到服务器上,边学边做,花了点时间终于成功部署了,这里总结记录一下过程中所遇到的问题及解决方法.之所以选择阿里云,考虑到它是使用用户最多也是最广泛的云服 ...

  7. CSS3 : transition 属性

    CSS3的 transition 属性用于状态过度效果! 1.语法: transition: property duration timing-function delay; -moz-transit ...

  8. Python网络编程(进程通信、信号、线程锁、多线程)

    什么是进程通讯的信号? 用过Windows的我们都知道,当我们无法正常结束一个程序时, 可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢? 同样的功能在Linux上是通过生成信号和捕获信号来实 ...

  9. 企业级Nginx Web服务优化实战

    web优化一览总结表 优化类型 优化说明 优化方法 安全优化 隐藏nginx版本信息优化 修改nginx配置文件实现优化 server_tokens off: 修改nginx版本信息优化 修改ngin ...

  10. hdu 1556 Color the ball (区间更新 求某点值)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...