个人认为这周题中较难的一道。

题意大概为:给定一张N个点M条边的无向图,求出无向图的一棵最小生成树,满足一号节点的度数不超过给定的整数K。保证 N <= 20

首先用map存取节点,之后抛去1号节点,求每一个联通分量的MST,就得到了一个局部最优解,设p为联通块的个数,接下来从每一个联通分量中找一个离1号节点距离最近的点,连接其与1号节点的边,就得到了一棵1号节点度数为p的生成树,之后逐渐放宽限制,枚举最终答案的度数,每次从1号节点往其他点连边,会形成一个环,求出该点到1路径上形成的环中边权最大值,之后把这个最大值剪断,将1号节点和该点连边。直到减小不了权值为止

下面给出标程(Author:????)

 #include <map>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = , INF = 0x3f3f3f3f;
struct E {
int x, y, z;
bool operator < (const E w) const
{
return z < w.z;
} }f[N];
int n, k, tot, ans, a[N][N], fa[N], d[N], v[N];
map<string, int> m;
vector<E> e;
bool b[N][N]; int get(int x) {
if (x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
// dfs(1,-1)
void dfs(int x, int o) {
for (int i = ; i <= tot; i++) {
if (i == o || b[x][i]==) continue;
if (f[i].z == -) {
if (f[x].z > a[x][i]) f[i] = f[x];
else {
f[i].x = x;
f[i].y = i;
f[i].z = a[x][i];
}
}
dfs(i, x);
}
} int main() {
cin >> n;
memset(a, 0x3f, sizeof(a));
memset(d, 0x3f, sizeof(d));
m["Park"] = tot = ;
for (int i = ; i < N; i++) fa[i] = i;
for (int i = ; i <= n; i++) {
E w;
string s1, s2;
cin >> s1 >> s2 >> w.z;
w.x = m[s1] ? m[s1] : (m[s1] = ++tot);
w.y = m[s2] ? m[s2] : (m[s2] = ++tot);
e.push_back(w);
a[w.x][w.y] = a[w.y][w.x] = w.z;
}
cin >> k;
sort(e.begin(), e.end());
for (unsigned int i = ; i < e.size(); i++) {
if (e[i].x == || e[i].y == ) continue;
int rtx = get(e[i].x), rty = get(e[i].y);
if (rtx != rty) {
fa[rtx] = rty;
b[e[i].x][e[i].y] = b[e[i].y][e[i].x] = ;
ans += e[i].z;
}
}
for (int i = ; i <= tot; i++)
if (a[][i] != INF) {
int rt = get(i);
if (d[rt] > a[][i])
d[rt] = a[][v[rt]=i]; // 记下每个父节点对应的边缘点以及边缘点和1号点的权值
}
for (int i = ; i <= tot; i++)
if (d[i] != INF) {
--k;
b[][v[i]] = b[v[i]][] = ;
ans += a[][v[i]];
}
//cout<<k<<endl;
while (k--) {
memset(f, -, sizeof(f));
f[].z = -INF;
for (int i = ; i <= tot; i++)
if (b[][i]) f[i].z = -INF;
dfs(, -);
int o, w = -INF;
for (int i = ; i <= tot; i++)
if (w < f[i].z - a[][i])
w = f[i].z - a[][o=i];
if (w <= ) break;
//cout<<o<<endl;
b[][o] = b[o][] = ;
b[f[o].x][f[o].y] = b[f[o].y][f[o].x] = ;
ans -= w;
}
printf("Total miles driven: %d\n", ans);
return ;
}

[暑假集训Day2T3]团建活动的更多相关文章

  1. 【团购活动】接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!

    接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!http://bbs.eeworld.com.cn/forum.php?mod=viewthread& ...

  2. 2015UESTC 暑假集训总结

    day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...

  3. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  4. 暑假集训Day2 互不侵犯(状压dp)

    这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...

  5. 暑假集训Day1 整数划分

    题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...

  6. 2013ACM暑假集训总结-致将走上大三征途的我

    回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...

  7. [补档]暑假集训D6总结

    考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...

  8. [补档]暑假集训D5总结

    %dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/   ...

  9. [补档]暑假集训D1总结

    归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...

随机推荐

  1. 行人重识别(ReID) ——数据集描述 DukeMTMC-reID

    数据集简介 DukeMTMC 数据集是一个大规模标记的多目标多摄像机行人跟踪数据集.它提供了一个由 8 个同步摄像机记录的新型大型高清视频数据集,具有 7,000 多个单摄像机轨迹和超过 2,700 ...

  2. Docker备份与迁移

    容器保存为镜像 通过以下命令将容器保存为镜像: docker commit [-m="提交的描述信息"] [-a="创建者"] 容器名称|容器ID 生成的镜像名 ...

  3. vue修改Element的el-table样式

    修改Element中的el-table样式,可以使用以下几种方法: 1. row-style 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style. 2. ...

  4. PHP实现session共享

    通过修改PHP-FPM配置文件,实现session会话共享: - 配置PHP使用memcached服务器共享Session信息 - 客户端访问两台不同的后端Web服务器时,Session 信息一致 环 ...

  5. readlink 查看符号链接的文件的内容

    1. 命令功能 readlink 查看软链接文件里的真实内容. 2. 语法格式 readlink [option]  file 参数 参数说明 -f 后跟软链接文件 3. 使用范例 范例1 查看文件链 ...

  6. 2018-08-01-weekly

    Algorithm 4. Median of Two Sorted Arrays What 两个排序数组的中位数 How 两个数组合并到同一个数组,然后进行排序取中间值即可 Key Codes cla ...

  7. SpringBoot application.proerties基本配置

    #设置日志输出路径,日志文件名称,输出日志级别 默认日志文件超过10M会切分成多个文件 最新的日志文件就是设置的日志文件 logging.level.root=INFOlogging.level.or ...

  8. JS原型链详解(2)

    深入理解javascript原型链 在javascript中原型和原型链是一个很神奇的东西,对于大多数人也是最难理解的一部分,掌握原型和原型链的本质是javascript进阶的重要一环.今天我分享一下 ...

  9. MAN PVCREATE

    PVCREATE(8)                                                        PVCREATE(8) NAME/名称       pvcreat ...

  10. Java中的栈和队列

    栈: public class Stack<E> extends Vector<E> { // 使用数组实现栈 // 构造一个空栈 public Stack() { } // ...