题目: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顶点度限制最小生成树的更多相关文章

  1. poj1639顶点度限制生成树

    题目:http://poj.org/problem?id=1639 对根的度数有限制的最小生成树: 先忽略根,跑最小生成树,得到几个连通块,再一一与根连上: 然后在限制内用根连出去的边来使生成树更小, ...

  2. lesson2-完全图、补图和顶点度

    (一).完全图.偶图与补图 1.每两个不同的顶点之间都有一条边相连的简单图称为完全图 (complete graph).在同构意义下,n个顶点的完全图只有一个,记为 2.所谓具有二分类(X, Y)的偶 ...

  3. 限制某个顶点度数的最小生成树 poj1639

    Picnic Planning Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10642   Accepted: 3862 ...

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

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

  5. CF-125E MST Company (单度限制最小生成树)

    参考红宝书 题目链接 对除 1 号点顶点外的点集,求一次最小生成森林,对于最小生成森林的联通分量,选择最短的一条边与 1 号点相连.设此时 1 号点的度为 \(k_0\),如果 \(k_0\lt L\ ...

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

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

  7. 度限制MST

    POJ1639 顶点度数限制的最小生成树 做法:首先把和顶点相连的X条边全部删掉 得到顶点和 X个连通块 然后求出这X个连通块的MST 再把X条边连接回去这样我们就首先求出了X度MST 知道了X度MS ...

  8. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

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

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

随机推荐

  1. java并发编程:线程安全管理类--原子操作类--AtomicLongArray

    1.类 AtomicLongArray public class AtomicLongArray extends Object implements Serializable 可以用原子方式更新其元素 ...

  2. Sql Server约束的学习一(主键约束、外键约束、唯一约束)

    一.约束的分类 1.实体约束 实体约束是关于行的,比如某一行出现的值不允许出现在其他行,例如主键约束. 2.域约束 域约束是关于列的,对于所有行,某一列有那些约束,例如检查约束. 3.参照完整性约束 ...

  3. zoj2112&&bzoj1901

    题解: 可修改的主席树 一开始,我就按照最暴力的方法,空间nlognlogn 然后zju上面过不了,bzoj没有权限号 然后,参考了往上的论文,发现可以把初始的主席树先建好 然后,每次只需要维护修改的 ...

  4. 数据结构(C语言)关于树、二叉树、图的基本操作。

    1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...

  5. zabbix监控系统的应用---数据监控、导入模板、告警

    一.zabbix监控nginx服务 1)在server2中安装nginx服务 --->  rpm  -ivh  nginx-1.8.0-1.el6.ngx.x86_64.rpm 2)编辑配置文件 ...

  6. C++中特殊的宏定义

    常规用法不再介绍,做如下几点说明和介绍 1. 带参数的宏只完成简单字符替换,之前不做计算实参的工作,如下 #define SUM(x,y) x+yint a=3,b=2,c=1;int s;s=SUM ...

  7. nw + iframe嵌入page 滚动条问题

    iframe 加载完之后会在原尺寸基础上增加4像素(因此我用以下方法处理): <iframe id="myiframe" style="visibility: hi ...

  8. 一起来点React Native——常用组件之Touchable系列

    在前面的登录界面中,我们发现所有的组件不会对用户的点击.触摸.拖拽做出合适的响应,这是十分不友好的.那么,在React Native中如何让视图对触发做出合适的响应呢? 一.高亮触摸  Touchab ...

  9. Vue 之axios获取Http响应头

    服务器端:Access-Control-Expose-Headers : 'Authorization' 客户端:res.headers.Authorization 引用链接:https://segm ...

  10. IOS沙盒机制

    一,ios应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问,此区域被称为沙盒 1,每个应用程序都有自己的存储空间 2,应用程序不能翻过自己的围墙去访问别的存储空间的内容. 3,应用 ...