/*
k度限制MST:有一个点的度<=k的MST
poj 1639
要求1号点的度不超过k 求MST
我们先把1号点扔掉 跑MST
假设有sum个连通分支 然后把这sum个分支连到1上
就得到了一个sum度的MST
这里往上连的时候 我们连这个分支里 距离1最近的
然后我们在1上加一条边 (即加一个度)得到sum+1度的MST
这里加边的时候 1连出去的每一条边都试一遍 取最小
假设当前1连到了 i 因为原来是个树 这样一搞就形成一个环
我们现在要删去环里面最长边 来得到更小的ans
我么维护dp[x]代表x到1的路径上权值最大的边的信息
(不包含与1直接相连的边否则删去1的度减1 并不能得到sum+1度的MST)
关键就是维护这个dp[x]
每次找sum+i度的MST之前我们从1dp一遍维护到每个点的max(沿着sum+i-1度的MST)
在树上跑 复杂度就降下来了On可以搞完
方程是 dp[x]=max(dp[from],G[from][x])
当新填的边不比找到的max边大的时候停下
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define maxn 110
using namespace std;
int n,m,k,num,G[maxn][maxn],vis[maxn][maxn],ans,mt[maxn],wh[maxn],sum,fa[maxn];
map<string,int>f;
struct node{
int u,v,t;
}e[maxn*maxn],dp[maxn*maxn];
int cmp(const node &A,const node &B){
return A.t<B.t;
}
void Add(int from,int to,int dis){
num++;e[num].v=to;
e[num].u=from;
e[num].t=dis;
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void Dfs(int now,int from){
for(int i=;i<=n;i++){
if(i==from)continue;
if(vis[now][i]){
if(dp[i].t!=-){
if(dp[now].t<G[now][i]){
dp[i].t=G[now][i];
dp[i].u=now;dp[i].v=i;
}
else dp[i]=dp[now];
}
Dfs(i,now);
}
}
}
void Kur(){
sort(e+,e++num,cmp);
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++){
if(e[i].u==||e[i].v==)continue;
if(find(e[i].u)==find(e[i].v))continue;
ans+=e[i].t;fa[find(e[i].u)]=find(e[i].v);
vis[e[i].u][e[i].v]=vis[e[i].v][e[i].u]=;
}
}
int main(){
scanf("%d",&m);f["Park"]=++n;
string A,B;int t;
memset(G,-,sizeof(G));
for(int i=;i<=m;i++){
cin>>A>>B>>t;
if(f[A]==)f[A]=++n;if(f[B]==)f[B]=++n;
Add(f[A],f[B],t);
if(G[f[A]][f[B]]==-)G[f[A]][f[B]]=G[f[B]][f[A]]=t;
else G[f[A]][f[B]]=G[f[B]][f[A]]=min(t,G[f[A]][f[B]]);
}
scanf("%d",&k);
Kur();memset(mt,/,sizeof(mt));
for(int i=;i<=n;i++){
if(G[][i]!=-){
int r=find(i);
if(G[][i]<mt[r]){
mt[r]=G[][i];
wh[r]=i;
}
}
}
for(int i=;i<=n;i++)
if(mt[i]!=mt[]){
sum++;ans+=G[][wh[i]];
vis[][wh[i]]=vis[wh[i]][]=;
}
//得到最小sum度树
for(int i=sum+;i<=k;i++){
dp[].t=-;
for(int j=;j<=n;j++){
if(vis[][j])dp[i].t=-;
else dp[i].t=;
}
Dfs(,-);
int pos,mii=1e9;
for(int j=;j<=n;j++){
if(G[][j]==-)continue;
if(mii>G[][j]-dp[j].t){
pos=j;mii=G[][j]-dp[j].t;
}
}
if(mii>=)break;
vis[][pos]=vis[pos][]=;
vis[dp[pos].u][dp[pos].v]=;
vis[dp[pos].v][dp[pos].u]=;
ans+=mii;
}
printf("Total miles driven: %d\n",ans);
return ;
}

K度限制MST poj 1639的更多相关文章

  1. 度限制最小生成树 POJ 1639 贪心+DFS+prim

    很好的解题报告: http://blog.csdn.net/new_c_yuer/article/details/6365689 注意两点: 1.预处理环中权值最大的边···· 2.可以把去掉度限制后 ...

  2. K - The Unique MST - poj 1679

    题目的意思已经说明了一切,次小生成树... ****************************************************************************** ...

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

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

  4. poj 1639 Picnic Planning 度限制mst

    https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...

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

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

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

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

  7. 最小k度限制生成树

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

  8. POJ 1639 Picnic Planning:最小度限制生成树

    题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...

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

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

随机推荐

  1. Python--10、生产者消费者模型

    生产者消费者模型(★) 平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度.程序中有两类角色:生产数据.消费数据实现方式:生产->队列->消费. 通过一个容器来解决生产者和消费 ...

  2. 3星|《刷新》:微软第三任CEO上任三年后的回顾

    刷新:重新发现商业与未来 作者是微软第三任CEO,2014年2月上任.本书英文版出版于2017年9月,全书内容大致截至于2017年年初,算是作者上任三年后的回顾. 书中作者讲了不少自己的个人经历.作者 ...

  3. Android Binder机制(一) Binder的设计和框架

    这是关于Android中Binder机制的一系列纯技术贴.花了一个多礼拜的时间,才终于将其整理完毕.行文于此,以做记录:也是将自己所得与大家分享.和以往一样,介绍Binder时,先讲解框架,然后再从设 ...

  4. iDRAC RAC0218 最大会话限制

    用ssh工具登陆IDRAC远程管理ip地址: /admin1-> racadm racreset RAC reset operation initated successfully.  It m ...

  5. Centos7自动式脚本搭建jumpserver

    JumpServer脚本 这里需要安装阿里的yum源和epel源并解压: epel源地址https://mirrors.tuna.tsinghua.edu.cn/epel// 安装阿里互联网yum仓库 ...

  6. Vim 写 C/C++ 的配置

    .vimrc 2018/08/08 更新 基本的配置,缩进显示行号等 给每个 C/C++ 文件添加头部,显示作者,文件创建时间 F5 编译执行 C/C++源代码 Ctrl + F 利用用 astyle ...

  7. LINQ简记(1):基本语法

    关于LINQ(语言集成查询)是.NET 3.5和Visual Studio 2008以上版本中引入的一种有趣的全新概念,语言版本有VB和C#,由于C#与.NET平台结合最为紧密,也是MS当初首推的语言 ...

  8. 第十节:pandas之loc()、iloc()与ix()索引

  9. sha2 替换sha1 时间表

    由于sha1签名算法进入淘汰阶段,逐渐弃用中,sha1升级为sha2是大势所趋. 微软已经正式发布sha1弃用策略: http://blogs.technet.com/b/pki/archive/20 ...

  10. Java基础学习总结(41)——JPA常用注解

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.         JPA由EJB 3.0软件专 ...