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辆车.现在问你在这个限制 ...
随机推荐
- 数据库操作——SQL
()修改数据表内容 UPDATE t_com_staffinfo set upnative = '河南省郑州市金水区' WHERE id = 1082
- spark submit 入门
spark dirver本质是一个spark集群的驱动程序,你要调用spark集群的计算功能,必须要通过它! from pyspark import SparkConf, SparkContext c ...
- [Vue warn]: Invalid prop: custom validator check failed for prop "xxx".问题
在用vue+ui框架(iview.elementui等)做项目,会遇到这种问题 这样的,点那都报错,千辛万苦的付出,却找不到问题在哪 其实很简单,报错都显示出那个组件的问题了 ‘<Form&g ...
- 找到多个与名为“Home”的控制器匹配的类型,如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间来搜索匹配此请求的
参考文章: http://blog.csdn.net/chengmodelong/article/details/41890229 https://www.cnblogs.com/zgqys1980/ ...
- docker官方windows安装
https://docs.docker.com/engine/installation/windows/
- oracle_sql语句的大全
# 建立数据库struts CREATE DATABASE IF NOT EXISTS struts DEFAULT CHARACTER SET GBK; 1.登录:(管理员)conn sys/p ...
- [需要补充]javaEE中servlet方法service与doXXX的关系
刚开始很模糊他们的关系,不清楚 service protected void service(HttpServletRequest req, HttpServletResponse resp) thr ...
- struts2 实现rest
参考链接https://www.ibm.com/developerworks/cn/java/j-lo-struts2rest/
- Alpha阶段项目复审
队名 优点 缺点 名次 大马猴队 出现BUG修复时间短:针对初期用户需求的分析缺点能够快速更正,针对用户痛点实现了功能:开发的过程中削减了无用的功能,源代码管理比较好,更改能够及时提交,相关成员都有参 ...
- 4K电视与4K显示器的选择
目前主流的电脑显示器分辨率是1920x1080,也就是常说的FHD标准,不过在智能手机都开始朝2560x1440前进了,PC显示器显然还需要更进一步的强化,下一代的标准就是4K分辨率,也就是Utlra ...