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

题意大概为:给定一张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. Web学习之CSS总结

    银角大王武Sir的博客地址 1.positoin属性固定元素的定位类型 说明:这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而无论该元素是什么类型.相 ...

  2. linux中的一些常用命令

    shutdown -h now 现在马上关机 shutdown -r now 现在重新启动 reboot 现在重新启动 su - 如果当前是普通用户,则输入这条命令切换到管理员用户(root),如果要 ...

  3. mysql的mod函数

    取余是用函数mod(numer1,number2),其返回的值为其余数值 如:mod(id,2) = 1 返回id号是奇数的id

  4. Java8 时间处理类的使用实践(LocalDate...)

    有了它,谁还在用Date?Calendar? 其实也不能这么绝对,毕竟还没到那个程度上.Java8 新增了处理时间的一组类(LocalDate.LocalDateTime.LocalTime),刚开始 ...

  5. git & gerrit & shell

    g公司使用Gerrit改善评审流程. 比较麻烦.gerrit提交后会触发vertifyCI, 实施代码扫描. 这一堆过程, 打印出一堆信息, 都在log中, 所以处理log就需要自己写shell了. ...

  6. dict以及defaultdict的简单使用

    先看一个需求 from collections import defaultdict """ 需求: 统计user_list中字母出现的次数 ""&q ...

  7. php stristr()函数 语法

    php stristr()函数 语法 作用:返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写.直线电机厂家怎么样? 语法:stristr(string,search,before_s ...

  8. 打印XX提交的svn版本信息

    打印出匹配uliuchao或--结尾的行 svn log | sed -n '/uliuchao/,/--$/p'

  9. laravel5.6 常规框架部署和配置文件说明

    示例demo文件位置: 入口默认index.php文件地址: 例如: /laravel5.6/public/index.php (1) 必须先初始化路由web.php文件地址: 例如: /larave ...

  10. LintCode之两两交换链表中的节点

    题目描述: 我的思路: 由题目描述可知,题目是要求将第一个与第二个节点,第三个与第四节点....进行交换,而进行交换时只用将节点的值进行交换即可.需要注意的是:当链表为null或者当链表只有一个节点时 ...