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辆车.现在问你在这个限制 ...
随机推荐
- jsp jstl标签库核心标签
JSTL标签库介绍 JSTL标签库的使用时为了弥补html标签的不足,规范自定义标签的使用而诞生的.使用标签的目的就是不希望在jsp页面中出现java逻辑代码 全称:JSTL标签库分类 核心标签库使用 ...
- mysql主从搭建之诡异事件
今天在搭建主从后出现了主库system账号丢失INSERT权限的情况,记录如下 主库: system账号权限同root权限,并且mysql库已经删除 从库: mysql库存在,无system账号 主从 ...
- .net下4款不错的微信SDK
.net下4款不错的微信SDK: 一款值得推荐的.Net微信开发SDK http://www.17ky.net/soft/474.html.Net微信公开帐号接口 WeiXinSDK http://w ...
- Pycharm(四)常用快捷键
Ctrl + Alt +S 进入设置Ctrl + Alt + L 代码格式化Ctrl + Alt + I 自动缩进Ctrl + D 复制当前行 Ctrl + / 注释(取消注释)当前行 再有什么用的多 ...
- C++ bitset
itset存储二进制数位. bitset就像一个bool类型的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一. bitset中的每个元 ...
- PHP多种序列化/反序列化的方法 serialize,json_encode等
序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize ...
- phpstorm 常用指令
先选中移动内容 块向右移动:Tab键 块向左移动:Shift + Tab键 ctrl+/行注释ctrl+shift+/块注释 ctrl+g跳转行 alt + 上/下 键实现在类中的方法切换ctrl + ...
- php 函数2
- Andriod Studio 解决问题 Failed to resolve: com.android.support:appcompat-v7:28.+
Andriod Studio报错提示: Error:(26, 13) Failed to resolve: com.android.support:appcompat-v7:28.+ 原因:Andri ...
- OC基础:内存(内存管理) 分类: ios学习 OC 2015-06-25 16:50 73人阅读 评论(0) 收藏
自动释放池: @autoreleasepool { } 内存管理机制 谁污染,谁治理 垃圾回收机制:gc(Garbage collection),由系统管理内存,开发人员不需要管理. OC ...