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辆车.现在问你在这个限制 ...
随机推荐
- POJ 1014 Dividing (多重可行性背包)
题意 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是( ...
- Linux文件与目录管理(三)
一.Linux文件内容查看 1.cat:由第一行开始显示文件内容 2.tac:从最后一行开始显示,可以看出tac是cat倒着写 3.nl:显示的时候,顺便输出行号 4.more:一页一页的显示文件内容 ...
- spring的FactoryBean
(以下内容翻译自spring/docs/3.2.18.RELEASE) 为具有工厂属性的对象实现FactoryBean接口. FactoryBean接口是spring IoC 容器实例化逻辑的一点补充 ...
- 使用pthread_create()创建线程
可以通过 pthread_create()函数创建新线程. #include <pthread.h> int pthread_create(pthread_t *restrict tidp ...
- selenium(三)浏览器操作
from time import sleep from selenium import webdriver #定义浏览器是firefox driver=webdriver.Firefox() #页面打 ...
- python随机数,随机选择……random
import random from random import random, uniform, randint, randrange, choice, sample, shuffle list = ...
- DevExpress v17.2新版亮点—.NET Reporting篇(二)
用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了.NET Reporting v17.2 的新功能,快来下载试用新版本! 支持AS ...
- ORACLE telnet 1521 不通及ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务的解决
服务器上安装了oracle11g , 防火墙上已经增加1521 入站规则.但是内网客户端配置好了TNS无法连接.telnet 1521 不通. 需要在服务器上\product\10.2.0\db_1\ ...
- Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1
VISIT HEREto gey a 1 year key.... for the latest version Promo code ? well use the same here too : C ...
- Beta 冲刺(6/7)
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10129063.html 作业博客:https://edu.cnblogs.com/campus ...