代码是抄的

题解是瞄的

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

然而

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

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

密码:blr4

代码如下

#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define fuck(x) cout<<"["<<x<<"]";
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w+",stdout);
//#pragma comment(linker, "/STACK:102400000,102400000") const int INF = 0x3f3f3f3f;
const int maxn = ; using namespace std; struct Edge{
int u, v, d;
Edge() {}
Edge(int a, int b, int c) : u(a), v(b), d(c) {}
bool operator < (const Edge &e) const {
return d < e.d;
}
}; int n, m, k;
int cnt;
int ans;
int f[maxn]; // 并查集
map<string, int> nodes;
vector<Edge> edges;
Edge dp[maxn];
int g[maxn][maxn];
bool tree[maxn][maxn]; // tree[i][j]=true表示<i, j>这条边在最小生成树中
int minEdge[maxn]; int find(int p) {
if (p == f[p]) return f[p];
return f[p] = find(f[p]);
} void unite(int p, int q) {
f[find(p)] = find(q);
} void kruskal() {
sort(edges.begin(), edges.end());
for (int i = ; i < edges.size(); i++) {
int p = edges[i].u;
int q = edges[i].v;
if (p == || q == ) continue; // 忽略根节点
if (find(p) != find(q)) {
unite(p, q);
tree[p][q] = tree[q][p] = ;
ans += edges[i].d;
}
}
} void dfs(int cur, int pre) {
for (int i = ; i <= cnt; i++) {
if (i == pre || !tree[cur][i]) continue;
if (dp[i].d == -) {
if (dp[cur].d > g[cur][i]) dp[i] = dp[cur];
else {
dp[i].u = cur;
dp[i].v = i;
dp[i].d = g[cur][i];
}
}
dfs(i, cur);
}
} void solve() {
int keyPoint[maxn];
for (int i = ; i <= cnt; i++) {
if (g[][i] != INF) {
// 点i在哪颗最小生成树中
int color = find(i);
// 每颗最小生成树中距离根节点最近的点与根节点的距离
if (minEdge[color] > g[][i]) {
minEdge[color] = g[][i];
keyPoint[color] = i;
}
}
}
for (int i = ; i <= cnt; i++) {
if (minEdge[i] != INF) {
m++;
tree[][keyPoint[i]] = tree[keyPoint[i]][] = ;
ans += g[][keyPoint[i]];
}
}
// 由i-1度生成树得i度生成树
for (int i = m + ; i <= k; i++) {
memset(dp, -, sizeof(dp));
dp[].d = -INF;
for (int j = ; j <= cnt; j++)
if (tree[][j]) dp[j].d = -INF;
dfs(, -); // dp预处理
int idx, minnum = INF;
for (int j = ; j <= cnt; j++) {
if (minnum > g[][j] - dp[j].d) {
minnum = g[][j] - dp[j].d;
idx = j;
}
}
if (minnum >= ) break;
tree[][idx] = tree[idx][] = ;
tree[dp[idx].u][dp[idx].v] = tree[dp[idx].v][dp[idx].u] = ;
ans += minnum;
}
} void init() {
memset(g, 0x3f, sizeof(g));
memset(tree, , sizeof(tree));
memset(minEdge, 0x3f, sizeof(minEdge));
m = ;
cnt = ;
ans = ;
nodes["Park"] = ;
for (int i = ; i < maxn; i++)
f[i] = i;
} int main() {
#ifndef ONLINE_JUDGE
FIN
#endif
scanf("%d", &n);
string s1, s2;
int d;
init();
for (int i = ; i <= n; i++) {
cin >> s1 >> s2 >> d;
if (!nodes[s1]) nodes[s1] = ++cnt;
if (!nodes[s2]) nodes[s2] = ++cnt;
int u = nodes[s1], v = nodes[s2];
edges.push_back(Edge(u, v, d));
g[u][v] = g[v][u] = min(g[u][v], d);
}
scanf("%d", &k);
kruskal(); // 忽略根节点先计算一次最小生成树,此时得到一个森林
solve();
printf("Total miles driven: %d\n", ans);
return ;
}

最小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-1.两数之和

    开学后忙的焦头烂额(懒得很),正式开始刷leecode的题目了. 想了想c语言是最最基础的语言,虽然有很多其他语言很简单,有更多的函数可以用,但c语言能煅炼下自己的思考能力.python则是最流行的语 ...

  2. 嵌入式框架Zorb Framework搭建四:状态机的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  3. 20145202 《网络对抗技术》 PC平台逆向破解

    20145202 <网络对抗技术> PC平台逆向破解 准备工作 先将环境设置为:堆栈可执行.地址随机化关闭 参考http://git.oschina.net/wildlinux/NetSe ...

  4. [转]URL传中文参数导致乱码的解决方案之encodeURI

    通过URL传中文参数时,在服务端后台获取到的值往往会出现乱码.解决方案有很多种.本文介绍如何通过encodeURI来解决中文乱码问题. 首先,在前端页面准备参数的时候,需要对中文参数进行encode处 ...

  5. springmvc+mybatis的两种配置和应用方式

    一.不用写dao层实现的方式 1.导入依赖包,我的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...

  6. .NET中调用不安全代码

           .NET中是不允许不安全的代码的,比如指针等.但有些特殊场合还是需要用到指针,这时候就需要在你的代码块上加上unsafe标签.如: 1: unsafe static void Main( ...

  7. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  8. 1098 Insertion or Heap Sort (25 分)(堆)

    这里的第二序列相当于是排序还没拍好的序列 对于第二个样例的第二个序列其实已经是大顶堆了 然后才进行的堆排序 知道这个就好做了 #include<bits/stdc++.h> using n ...

  9. mongodb数据库操作之简单查询

    1. 2. 3.修改器 默认一条一条修改 4. 5.查询 6.mysql简单操作

  10. URAL 1741 Communication Fiend(最短路径)

    Description Kolya has returned from a summer camp and now he's a real communication fiend. He spends ...