题目描述

矮人虽小却喜欢乘坐巨大的轿车,轿车大到可以装下无论多少矮人。某天,N(N≤20)个矮人打算到野外聚餐。为了

集中到聚餐地点,矮人A 有以下两种选择

1)开车到矮人B家中,留下自己的轿车在矮人B家,然后乘坐B的轿车同行

2)直接开车到聚餐地点,并将车停放在聚餐地。虽然矮人的家很大,可以停放无数量轿车,但是聚餐地点却最多只能停放K辆轿车。

现在给你一张加权无向图,它描述了N个矮人的家和聚餐地点,要你求出所有矮人开车的最短总路程。

输入格式

第一行是整数M,接下来M行描述了M条道路。

每行形式如同:S1 S2 x,S1和S2均是由字母组成长度不超过20的字符串

(特别地,当该字符串为”Park”时表示聚餐地点),x是整数,表示从S1到S2的距离。

最后一行包含单独的整数k.

输出格式

仅一行,形式如同:

Total miles driven: xxx

xxx是整数,表示最短总路程。


设Park为1节点。

先不考虑1节点,我们求出去掉1节点之后的图的最小生成树森林。设森林包含x棵树,那么我们从每棵树上都找出一条最短的连向1节点的边连起来。

然后我们可以再给1节点加上k-x条边。扫描1节点连接的所有还没被加入生成树的边,设其边长为p,两个端点为u,v,我们求出u和v在生成树上的路径中的最大边,设其边长为q。如果p-q<0,那么把q删去,把p加上。直到扫描完所有边或者加了k-x条边时,我们便得到了题目所求的生成树。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define maxn 31
using namespace std;struct edge{int u,v,w;bool operator<(const edge &e)const{ return w<e.w; }
}e[maxn*maxn],dp[maxn];int key[maxn],minedge[maxn];
int fa[maxn],g[maxn][maxn];
bool tree[maxn][maxn];
int n,m,k,ans;
map<string,int> id;inline int read(){register int x(0),f(1); register char c(getchar());while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}int get(int x){ return fa[x]==x?x:fa[x]=get(fa[x]); }
inline void kruskal(){sort(e+1,e+1+m);for(register int i=1;i<=n;i++) fa[i]=i;for(register int i=1;i<=m;i++){int u=e[i].u,v=e[i].v,w=e[i].w;if(u==1||v==1||get(u)==get(v)) continue;fa[get(u)]=get(v),tree[u][v]=tree[v][u]=true;ans+=w;}
}void dfs(int u,int pre){for(register int i=2;i<=n;i++) if(tree[u][i]){if(i==pre) continue;if(dp[i].w==-1){if(dp[u].w>g[u][i]) dp[i]=dp[u];else{dp[i].w=g[u][i],dp[i].u=u,dp[i].v=i;}}dfs(i,u);}
}
inline void solve(){register int cnt=0;for(register int i=2;i<=n;i++) if(g[i][1]!=0x3f3f3f3f){int col=get(i);if(g[i][1]<minedge[col]) minedge[col]=g[i][1],key[col]=i;}for(register int i=1;i<=n;i++) if(minedge[i]!=0x3f3f3f3f){cnt++,tree[key[i]][1]=tree[1][key[i]]=true;ans+=g[1][key[i]];}for(register int i=cnt+1;i<=k;i++){memset(dp,-1,sizeof dp);dp[1].w=-0x3f3f3f3f;for(register int j=2;j<=n;j++) if(tree[1][j]) dp[j].w=-0x3f3f3f3f;dfs(1,1);int d,mini=0x3f3f3f3f;for(register int j=2;j<=n;j++) if(mini>g[1][j]-dp[j].w){mini=g[1][j]-dp[j].w,d=j;}if(mini>=0) continue;tree[1][d]=tree[d][1]=true,tree[dp[d].u][dp[d].v]=tree[dp[d].v][dp[d].u]=false;ans+=mini;}
}int main(){memset(g,0x3f,sizeof g),memset(minedge,0x3f,sizeof minedge);m=read(),id["Park"]=++n;for(register int i=1;i<=m;i++){string a,b; cin>>a>>b;if(!id[a]) id[a]=++n;if(!id[b]) id[b]=++n;e[i].u=id[a],e[i].v=id[b],e[i].w=read();g[e[i].u][e[i].v]=g[e[i].v][e[i].u]=min(g[e[i].u][e[i].v],e[i].w);}k=read();kruskal(),solve();printf("Total miles driven: %d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/akura/p/11047384.html

POJ1629:picnic planning相关推荐

  1. Poj·Picnic Planning

    初见安~这里是传送门:Poj P1639 Description The Contortion Brothers are a famous set of circus clowns, known wo ...

  2. 【题解】poj1639[2018.8.24校赛 最小生成树 A]Picnic Planning 最小度限制生成树

    题目链接 Description The Contortion Brothers are a famous set of circus clowns, known worldwide for thei ...

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

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

  4. pku 1639 Picnic Planning 最小度限制生成树

    http://poj.org/problem?id=1639 题意: 见黑书. 思路: 最小限制树模板题: #include <iostream> #include <cstdio& ...

  5. poj1639 Picnic Planning 最小度数限制生成树

    题意:若干个人开车要去park聚会,可是park能停的车是有限的,为k.所以这些人要通过先开车到其它人家中,停车,然后拼车去聚会.另外,车的容量是无限的,他们家停车位也是无限的. 求开车总行程最短. ...

  6. Picnic Planning POJ - 1639(度限制生成树)

    解题报告 题意理解 给定一张N个点,M个边的无向图,求出无向图的一颗最小生成树,但是我们要求一号节点的入度不可以超过给定的整数S 也就是一个最小生成树,要求它的一号节点,最多只能和S个节点相连. 思路 ...

  7. 《算法竞赛进阶指南》0x62 T2 Picnic Planning

    题目传送门 题目描述 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. n个数进栈后输出的可能序列数
  2. 4.1 基础-放苹果(整数划分)
  3. redission收发命令流程分析
  4. Go赋值使用:类型{} 定位使用.
  5. Linux下的FTP命令害死人
  6. 【Spring-AOP-1】AOP相关概念
  7. 数据库实验二 SQL语言
  8. Element-UI-快速入门(极简教程)
  9. Codeigniter基础
  10. bcp大容量复制实用工具_运行中的BCP(大容量复制程序)命令
  11. 苹果华人工程师被捕后续,按“商业间谍”指控,本人不认罪
  12. ajax blockUI
  13. 易维联温湿度记录仪的使用
  14. 数字图像处理实验03——图像几何变换
  15. Android中Vitamio视频框架学习
  16. 教程篇(7.0) 05. FortiGate基础架构 IPsec安全隧道 ❀ Fortinet 网络安全专家 NSE 4
  17. jquery事件绑定的问题Uncaught TypeError: $(...).live is not a function at HTMLDocument.<anonymous> (ex5_
  18. saas(sccs)、less、stylus三者的区别
  19. 【获奖公布】“我的2016”主题征文活动
  20. 播放失败246106异常代码_美的燃气热水器修理分享(附代码解释)

热门文章

  1. express web的一款mvc框架
  2. php完美实现下载远程图片保存到本地(保存微信头像)
  3. 轻量级的jQuery表单验证插件 - HAPPY.js
  4. 使用粘性布局实现tab滑动后置顶
  5. 红帽喊话开发者:我们将支持 OpenJDK 8 到2023年
  6. 前端面试常考知识点---js
  7. 清明是品茗的好时节,那么你了解quot;明前茶quot;吗?
  8. WKWebView 实现iOS与H5的交互转
  9. 数组中只出现一次的数字
  10. tpopela/vips_java