POJ1639顶点度限制最小生成树
题目:http://poj.org/problem?id=1639
见汪汀的《最小生成树问题的拓展》。
大体是先忽略与根节点相连的边,做一遍kruscal,得到几个连通块和一个根节点;
然后根节点和每个连通块连一条边,当然是尽量小的,这时连的边就是根的最少度;
然后用增广的思路多给根连边,具体证明见论文;当最优的交换值也是负的时候break。
每次都要从根开始重弄dp值是因为要赋一遍初值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>//
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N=;
const ll INF=0x7fffffff;
int n,m,K,s,fa[N],xnt,tmp[N],rd,rnt;
bool b[N][N];
ll f[N][N],d[N],ans;
map<string,int> mp;
struct Bh{
int x,y;
Bh(int a=,int b=):x(a),y(b) {}
}bh[N],r[N];
bool cmp(int a,int b){return f[s][a]<f[s][b];}
bool cmp2(Bh a,Bh b){return f[a.x][a.y]<f[b.x][b.y];}
int find(int a)
{
if(fa[a]==a)return a;
return fa[a]=find(fa[a]);
}
void dfs(int cur,int fa)
{
// printf("(%d)",cur);
for(int i=;i<=n;i++)
if(b[cur][i]&&i!=fa)
{
if(d[i]<d[cur])d[i]=d[cur],bh[i]=bh[cur];
if(d[i]<f[cur][i])d[i]=f[cur][i],bh[i]=Bh(cur,i);
dfs(i,cur);
}
}
int main()
{
scanf("%d",&m);
memset(f,,sizeof f);
string x,y;ll z;
for(int i=;i<=m;i++)
{
cin>>x>>y>>z;//
if(!mp[x])mp[x]=++n;if(!mp[y])mp[y]=++n;
f[mp[x]][mp[y]]=f[mp[y]][mp[x]]=min(f[mp[x]][mp[y]],z); }
s=mp["Park"];
scanf("%d",&K);
for(int i=;i<=n;i++)
{
fa[i]=i;
for(int j=i+;j<=n;j++)
if(f[i][j]<INF)r[++rnt]=Bh(i,j);
}
sort(r+,r+rnt+,cmp2); //
for(int u=,i,j;u<=rnt;u++)
if(find(i=r[u].x)!=find(j=r[u].y)&&i!=s&&j!=s)
{
fa[find(i)]=find(j);
b[i][j]=b[j][i]=;
}
for(int i=;i<=n;i++)
if(f[s][i]<INF&&i!=s)tmp[++xnt]=i;
sort(tmp+,tmp+n,cmp);
for(int i=,v;i<=n;i++)
if(find(v=tmp[i])!=s)
{
fa[find(v)]=s;
b[v][s]=b[s][v]=;
rd++;
}
memset(d,-,sizeof d);
dfs(s,);
for(;rd<=K;rd++)
{
ll mx=-INF;int u=;
for(int i=,v;i<=xnt;i++)
if(!b[v=tmp[i]][s]&&f[bh[v].x][bh[v].y]-f[s][v]>mx)
mx=f[bh[v].x][bh[v].y]-f[s][v],u=v;
if(mx<=)break;//
b[s][u]=b[u][s]=;
b[bh[u].x][bh[u].y]=b[bh[u].y][bh[u].x]=;
memset(d,-,sizeof d);//
dfs(s,);
}
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
ans+=b[i][j]?f[i][j]:;
printf("Total miles driven: %lld",ans);
return ;
}
POJ1639顶点度限制最小生成树的更多相关文章
- poj1639顶点度限制生成树
题目:http://poj.org/problem?id=1639 对根的度数有限制的最小生成树: 先忽略根,跑最小生成树,得到几个连通块,再一一与根连上: 然后在限制内用根连出去的边来使生成树更小, ...
- lesson2-完全图、补图和顶点度
(一).完全图.偶图与补图 1.每两个不同的顶点之间都有一条边相连的简单图称为完全图 (complete graph).在同构意义下,n个顶点的完全图只有一个,记为 2.所谓具有二分类(X, Y)的偶 ...
- 限制某个顶点度数的最小生成树 poj1639
Picnic Planning Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10642 Accepted: 3862 ...
- 度限制最小生成树 POJ 1639 贪心+DFS+prim
很好的解题报告: http://blog.csdn.net/new_c_yuer/article/details/6365689 注意两点: 1.预处理环中权值最大的边···· 2.可以把去掉度限制后 ...
- CF-125E MST Company (单度限制最小生成树)
参考红宝书 题目链接 对除 1 号点顶点外的点集,求一次最小生成森林,对于最小生成森林的联通分量,选择最短的一条边与 1 号点相连.设此时 1 号点的度为 \(k_0\),如果 \(k_0\lt L\ ...
- poj1639 Picnic Planning,K度限制生成树
题意: 矮人虽小却喜欢乘坐巨大的轿车,车大到能够装下不管多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了集中到聚餐地点,矮人A 要么开车到矮人B 家中,留下自己的轿车在矮人B 家,然后乘坐B ...
- 度限制MST
POJ1639 顶点度数限制的最小生成树 做法:首先把和顶点相连的X条边全部删掉 得到顶点和 X个连通块 然后求出这X个连通块的MST 再把X条边连接回去这样我们就首先求出了X度MST 知道了X度MS ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 【POJ 1639】 Picnic Planning (最小k度限制生成树)
[题意] 有n个巨人要去Park聚会.巨人A和先到巨人B那里去,然后和巨人B一起去Park.B君是个土豪,他家的停车场很大,可以停很多车,但是Park的停车场是比较小.只能停k辆车.现在问你在这个限制 ...
随机推荐
- kill word out e ef en em
1● e 2● ef 出,出来 3● en 4● em 使~进入状态,包围,进入~之中
- 074——VUE中vuex之模块化modules开发实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- POJ 2109 Power of Cryptography 大数,二分,泰勒定理 难度:2
import java.math.BigInteger; import java.util.Scanner; public class Main { static BigInteger p,l,r,d ...
- 模拟QQ分组(具有伸缩功能) (添加开源框架的光闪烁效果)SimpleExpandableListAdapter 适配器的用法,并且可添加组及其组内数据。
package com.lixu.qqfenzu; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...
- 一张图告诉你为何必须学Python?
互联网行业的薪资高.发展前景好,已经是人尽皆知的事了.越来越多的人对编程有了兴趣,想通过加入大公司实现人生逆袭,我们身边也涌现出了一些从零学习.变身大神的励志故事. 但更多的人还是选择观望:有人觉得编 ...
- 《Python》内置方法进阶和常用模块
一:__new__ 在__init__之前,实例化对象的第一步是__new__创建了一个空间 class Foo: def __init__(self): # 初始化方法 print('执行了init ...
- 201621123010《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- Final阶段第1周/共1周 Scrum立会报告+燃尽图 02
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481] 版本控制:https://git.coding.net/liuyy08 ...
- firefor打不开问题
解决办法如下,点击开始→运行→输入命令 firefox.exe -p -no-remote ,win7系统用户好像开始下没有运行栏,同时按键盘win+R键即可打开运行窗口,然后点击创建配置文件,创建一 ...
- avalonJS-源码阅读(3) VMODEL
来源 avalon的重头戏.终于要到我最期待的vmodel了. ps:这篇博文想做的全一点,错误少一点,所以会有后续的更新在这篇文章中. 状态:一稿 目录[-] avalon dom小结 数据结构 观 ...