[暑假集训Day2T3]团建活动
个人认为这周题中较难的一道。
题意大概为:给定一张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]团建活动的更多相关文章
- 【团购活动】接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!
接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!http://bbs.eeworld.com.cn/forum.php?mod=viewthread& ...
- 2015UESTC 暑假集训总结
day1: 考微观经济学去了…… day2: 一开始就看了看一道题目最短的B题,拍了半小时交了上去wa了 感觉自己一定是自己想错了,于是去拍大家都过的A题,十分钟拍完交上去就A了 然后B题写了一发暴力 ...
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- 暑假集训Day2 互不侵犯(状压dp)
这又是个状压dp (大型自闭现场) 题目大意: 在N*N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ...
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
- 2013ACM暑假集训总结-致将走上大三征途的我
回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...
- [补档]暑假集训D6总结
考试 不是爆零,胜似爆零= = 三道题,就拿了20分,根本没法玩好吧= = 本来以为打了道正解,打了道暴力,加上个特判分,应该不会死的太惨,然而--为啥我只有特判分啊- - 真的是惨. 讲完题觉得题是 ...
- [补档]暑假集训D5总结
%dalao 今天又有dalao来讲课,讲的是网络流 网络流--从入门到放弃:7-29dalao讲课笔记--https://hzoi-mafia.github.io/2017/07/29/27/ ...
- [补档]暑假集训D1总结
归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...
随机推荐
- glibc2.22
- Winfrom中数据的双向绑定(使用INotifyPropertyChanged)
在WPF中新建项目是自动实现了INotifyPropertyChanged接口,用于数据绑定时非常的方便在winfrom中也可以实现INotifyPropertyChanged接口 将需要绑定的字段写 ...
- pg_dumpall - 抽出一个 PostgreSQL 数据库集群到脚本文件中
SYNOPSIS pg_dumpall [ option...] DESCRIPTION 描述 pg_dumpall 是一个用于写出("转储")一个数据库集群里的所有 Postgr ...
- TensorFlow——MNIST手写数字识别
MNIST手写数字识别 MNIST数据集介绍和下载:http://yann.lecun.com/exdb/mnist/ 一.数据集介绍: MNIST是一个入门级的计算机视觉数据集 下载下来的数据集 ...
- CentOS7 设置电源选项,待机、睡眠、挂起
设置装有 CentOS7 的笔记本合盖后黑屏进入睡眠模式 systemd 能够处理某些电源相关的 ACPI事件,你可以通过从 /etc/systemd/logind.conf 以下选项进行配置: Ha ...
- devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线
持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...
- python实现通过企业微信发送消息
实现了通过企业微信发送消息,平时用于运维的告警还是不错的,相对于邮件来说,实时性更高,不过就是企业微信比较麻烦,此处不做过多解释. 企业微信api的详细请看:http://work.weixin.qq ...
- 远程连接Linux相关操作
1.远程连接的步骤 编译网卡配置文件,修改onboot参数 vi /etc/sysconfig/network-scripts/ifcfg-ens33进入命令之后将onboot改成onboot=yes ...
- HDU 5386 Cover
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 题目大意:给一个初始矩阵(n×n).一个目标矩阵(n×n)和m个操作,要求找到一种操作顺序,使初 ...
- 英语单词composing
composing 来源——书籍Python.Crash.Course.2015.11 Using Individual Values from a List You can use individu ...