K度限制MST poj 1639
- /*
- 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的更多相关文章
- 度限制最小生成树 POJ 1639 贪心+DFS+prim
很好的解题报告: http://blog.csdn.net/new_c_yuer/article/details/6365689 注意两点: 1.预处理环中权值最大的边···· 2.可以把去掉度限制后 ...
- K - The Unique MST - poj 1679
题目的意思已经说明了一切,次小生成树... ****************************************************************************** ...
- 【POJ 1639】 Picnic Planning (最小k度限制生成树)
[题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...
- poj 1639 Picnic Planning 度限制mst
https://vjudge.net/problem/POJ-1639 题意: 有一群人,他们要去某一个地方,每个车可以装无数个人,给出了n条路,包含的信息有路连接的地方,以及路的长度,路是双向的,但 ...
- poj 1639 最小k度限制生成树
题目链接:https://vjudge.net/problem 题意: 给各位看一下题意,算法详解看下面大佬博客吧,写的很好. 参考博客:最小k度限制生成树 - chty - 博客园 https:/ ...
- Picnic Planning POJ - 1639(最小k度生成树)
The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible abil ...
- 最小k度限制生成树
[题目描述] 给你一个图,n个点,m条边,求一颗生成树满足如下条件: (1)结点1的度不超过k. (2)在(1)条件下所求生成树最小. [算法引入] 最小k度限制生成树,就是指有特殊的某一点的度不能超 ...
- POJ 1639 Picnic Planning:最小度限制生成树
题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...
- poj1639 Picnic Planning,K度限制生成树
题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...
随机推荐
- Ubuntu 系统的常用快捷键
Ubuntu操作基本快捷键 ibus-setup :设置系统输入法 scp filename username@serverIp:/home/xxx/xxx/filename 回车输入该usern ...
- vue杂记
VUE杂记 声明式渲染 <div id="app"> {{ message }} </div> var app = new Vue({ el: '#app' ...
- Android基于HttpUrlConnection类的文件下载
/** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param pat ...
- CommandBehavior.CloseConnection使用
其用在ExecuteReader(c)中,返回对象前不能关闭数据库连接,须用CommandBehavior.CloseConnection: 这是一个关于实际知识点的问题,面试官考查的是应聘者数据库访 ...
- JS——思维拓展
1.阶乘求和:4的阶乘是1*2*3*4 <script> function jiechen(value) { var n = 1; for (var i = 1; i <= valu ...
- 转载:使用FileReader对象的readAsDataURL方法来读取图像文件
文章转载自:http://blog.okbase.net/jquery2000/archive/1296.html: FileReader对象的readAsDataURL方法可以将读取到的文件编码成D ...
- 【译】x86程序员手册01
Intel 80386 Reference Programmer's Manual 80386程序员参考手册 Chapter 1 -- Introduction to the 80386 第1章 - ...
- 3星|《商业周刊中文版:2017商业人物(下)》:酒店才应该是出行住宿的最佳选择,Airbnb不是
商业周刊/中文版:2017商业人物(下) 对一些知名商业人物的访谈的合辑. 总体评价3星,有一些参考价值. 以下是本期一些内容的摘抄: 1:段永平是一位隐秘的亿万富豪,去年,他创立的智能手机姊妹品牌O ...
- RHEL7配置中文输入法-智能拼音
RHEL7配置中文输入法-智能拼音 RHEL7.x(CentOS7.x)系统相对之前的6.x系统变化较大,虽然安装时选择了中文环境,但是进入系统后,在控制台及编辑器中仍无法切换输入法进行中文输入. 原 ...
- 用C#在Visual Studio写Javascript单元测试
1.在vs创建一个标准的单元测试工程 2.引用nuget包:Edge.js 我是用的是6.11.2版本 3.编写JsRunner类 using EdgeJs; using System; using ...