poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图。最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小。
题目算法:朱-刘算法(即由中国人朱永津和刘振宏共同发明的算法)。
算法步骤如下:
1.判断图的连通性,若不连通直接无解,否则一定有解。
2.为除了根节点以外的所有点选择一个权值最小的入边,假设用pre数组记录前驱,f数组记录选择的边长,记所选边权和为temp。
3.(可利用并查集)判断选择的的边是否构成环,若没有则直接ans+=temp并输出ans,若有,则进行下一步操作。
4.对该环实施缩点操作,设该环上有点V1,V2……Vi……Vn,缩成的点为node ,对于所有不在环中的点P进行如下更改:
(1) 点P到node的距离为min{a[p,Vi]-f[Vi]} (a为边集数组)
(2)点node到p的距离为min{a[Vi,p]}
操作(1)的理解:先假设环上所有边均选上,若下次选择某一条边进入该环,则可以断开进入点与进入点的前驱之间的边,即断开F[进入点],所以等效为直接把a[p,node]赋值为min{a[p,Vi]-f[Vi]}。
特别提醒:本题有自环,可以提前删掉,因为它没有用。

最后G++double输出lf会wa,改成f就好了,或者用c++提交
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; double x[N],y[N];
int n,m;
int pre[N];
bool vis[N],in[N];
double w[N][N];
double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
void dfs(int u)
{
vis[u]=;
for(int i=;i<=n;i++)
if(!vis[i]&&w[u][i]<inf)
dfs(i);
}
double dirmst(int u)
{
double ans=;
dfs(u);
for(int i=;i<=n;i++)
if(!vis[i])
return -;
memset(vis,,sizeof vis);
while(){
for(int i=;i<=n;i++)
{
if(i!=u&&!in[i])
{
w[i][i]=inf;
pre[i]=i;
for(int j=;j<=n;j++)
if(!in[j]&&w[j][i]<w[pre[i]][i])
pre[i]=j;
}
}
int i;
for(i=;i<=n;i++)
{
if(i!=u&&!in[i])
{
int j=i,cnt=;
while(j!=u&&pre[j]!=i&&cnt<=n)cnt++,j=pre[j];
if(j==u||cnt>n)continue;
break;
}
}
if(i>n)
{
for(int j=;j<=n;j++)
if(j!=u&&!in[j])
ans+=w[pre[j]][j];
return ans;
}
int j=i;
memset(vis,,sizeof vis);
do{
ans+=w[pre[j]][j],j=pre[j],vis[j]=in[j]=;
}while(j!=i);
in[i]=;
for(int k=;k<=n;k++)
if(vis[k])
for(int j=;j<=n;j++)
if(!vis[j])
{
if(w[i][j]>w[k][j])w[i][j]=w[k][j];
if(w[j][k]<inf&&w[j][k]-w[pre[k]][k]<w[j][i])
w[j][i]=w[j][k]-w[pre[k]][k];
}
}
return ans;
}
int main()
{
/* ios::sync_with_stdio(false);
cin.tie(0);
cout<<setiosflags(ios::fixed)<<setprecision(2)<<endl;*/
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=;i<=n;i++)
{
vis[i]=in[i]=;
for(int j=;j<=n;j++)
w[i][j]=inf;
}
while(m--){
int a,b;
scanf("%d%d",&a,&b);
if(a==b)continue;
w[a][b]=dis(a,b);
}
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<w[i][j]<<" ";
cout<<endl;
}*/
double ans=dirmst();
if(ans<)printf("poor snoopy\n");
else printf("%.2f\n",ans);
}
return ;
}
最小树形图
poj3164最小树形图模板题的更多相关文章
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- uva11183 最小树形图模板题
很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...
- poj3164 最小树形图板子题
/* 思路很简单,也不知道哪里错了TAT */ /* N个点通过笛卡尔坐标表示 根节点是1,求最小树形图 */ #include<iostream> #include<cstdio& ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- hdu4009最小树形图板子题
/*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
随机推荐
- HTML的特殊字符-图标对应表
本文摘自:http://www.cnblogs.com/web-d/archive/2010/04/16/1713298.html HTML特殊字符编码大全:往网页中输入特殊字符,需在html代码 ...
- 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块
[BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...
- zabbix安装配置2
1.平台:centos6.5 2.安装epel: yum install http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch ...
- ssh-keygen 不是内部或外部命令解决办法!
在使用 git 的远程仓库的时候,生成秘钥的使用,会遇到ssh-keygen不是内部命令也不是外部命令的问题: 具体解决: 第一步:找到:Git/usr/bin目录下的ssh-keygen.exe(一 ...
- spring-boot集成redis
application.properties #redis 配置 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redi ...
- Linux定时检测内存,若使用率超过指标,重启Tomcat并清空内存
cd /usr/local vim cleanCacheTime.sh 把以下代码粘贴进去 #!/bin/bash echo "start SyncCleanCache.sh..." ...
- Code Forces 652C Foe Pairs
C. Foe Pairs time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- SQL---->mySQl数据库1------数据库的增删改查备份恢复
1.在终端输入:mysql -uroot -p 然后输入密码,进入客户端 2.输入:\s 3.创建数据库 3.1创建字符集是utf-8的数据库 3.2创建带校验规则的数据库,校验规则可以在a ...
- 使用Dataset构建数据到lgb中
训练数据要放到Dataset中供lgb使用,构建数据如下: import lightgbm as lgb import numpy as np # 训练数据,500个样本,10个维度 train_da ...
- IETF国标查询
IETF官网 https://www.ietf.org/ rfc国标官网 https://www.ietf.org/standards/rfcs/ rfc国标查询 https://www.rfc-ed ...