poj 3164 最小树形图模板!!!
/*
tle十几次,最后发现当i从1开始时,给环赋值时要注意啊!
最小树形图
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 110
#define inf 0x3fffffff
#define eps 1e-10
struct node {
int u,v;
double w;
}edge[N*N*2];
double distance (double x,double y,double xx,double yy) {
return sqrt(1.0*(x-xx)*(x-xx)+1.0*(y-yy)*(y-yy));
}
int visit[N],id[N],pre[N],yong,n;
double dis[N];
void addedge(int u,int v,double w){
edge[yong].u=u;
edge[yong].v=v;
edge[yong++].w=w;
}
double zhuliu(int root) {//朱刘算法模板
double sum=0;
while(1) {
int i;
for(i=0;i<n;i++)
dis[i]=inf;
memset(id,-1,sizeof(id));
memset(visit,-1,sizeof(visit));
for(i=0;i<yong;i++) {
int u=edge[i].u,v=edge[i].v;
if(dis[v]>edge[i].w&&u!=v){
pre[v]=u;
dis[v]=edge[i].w;
// if(u==root)//记录最后与根节点连接的边
// index=i;
}
}
pre[root]=root;
dis[root]=0;
for(i=0;i<n;i++) {
if(i==root)continue;
if(dis[i]==inf)return -1;
sum+=dis[i];
}
int res=0;
for(i=0;i<n;i++) {
int v=i;
while(visit[v]!=i&&id[v]==-1&&v!=root) {
visit[v]=i;
v=pre[v];
}
if(v!=root&&id[v]==-1) {
int u;
for(u=pre[v];u!=v;u=pre[u])
id[u]=res;
id[v]=res++;//如果下标从1开始不能这么写了
}
}
if(res==0)
break;
for(i=0;i<n;i++) {
if(id[i]==-1)
id[i]=res++;//同上
}
for(i=0;i<yong;i++) {
int v=edge[i].v;
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
if(edge[i].u!=edge[i].v)
edge[i].w-=dis[v];
}
n=res;root=id[root];
}
return sum;
} int main() {
int m,i,j;
double k,a[N],b[N];
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1;i<=n;i++)
scanf("%lf%lf",&a[i],&b[i]);
yong=0;
while(m--) {
scanf("%d%d",&i,&j);
addedge(i-1,j-1,i==j?inf:distance(a[i],b[i],a[j],b[j]));
}
k=zhuliu(0);
if(k<0)
printf("poor snoopy\n");
else
printf("%.2f\n",k);
}
return 0;
}
/*
下标是1-n;
如果是for(i=1;i<n;i++)还要注意n=res+1。所以模板不能乱改啊
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 110
#define inf 0x3fffffff
#define eps 1e-10
struct node {
int u,v;
double w;
}edge[N*N*2];
double distance (double x,double y,double xx,double yy) {
return sqrt(1.0*(x-xx)*(x-xx)+1.0*(y-yy)*(y-yy));
}
int visit[N],id[N],pre[N],yong,n;
double dis[N];
void addedge(int u,int v,double w){
edge[yong].u=u;
edge[yong].v=v;
edge[yong++].w=w;
}
double zhuliu(int root) {//朱刘算法模板
double sum=0;
while(1) {
int i;
for(i=1;i<=n;i++)
dis[i]=inf;
memset(id,-1,sizeof(id));
memset(visit,-1,sizeof(visit));
for(i=0;i<yong;i++) {
int u=edge[i].u,v=edge[i].v;
if(dis[v]>edge[i].w&&u!=v){
pre[v]=u;
dis[v]=edge[i].w;
// if(u==root)//记录最后与根节点连接的边
// index=i;
}
}
pre[root]=root;
dis[root]=0;
for(i=1;i<=n;i++) {
if(i==root)continue;
if(dis[i]==inf)return -1;
sum+=dis[i];
}
int res=0;
for(i=1;i<=n;i++) {
int v=i;
while(visit[v]!=i&&id[v]==-1&&v!=root) {
visit[v]=i;
v=pre[v];
}
if(v!=root&&id[v]==-1) {
int u;
id[v]=++res;
for(u=pre[v];u!=v;u=pre[u])
id[u]=res;
}
}
if(res==0)
break;
for(i=1;i<=n;i++) {
if(id[i]==-1)
id[i]=++res;
}
for(i=0;i<yong;i++) {
int v=edge[i].v;
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
if(edge[i].u!=edge[i].v)
edge[i].w-=dis[v];
}
n=res;root=id[root];
}
return sum;
} int main() {
int m,i,j;
double k,a[N],b[N];
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1;i<=n;i++)
scanf("%lf%lf",&a[i],&b[i]);
yong=0;
while(m--) {
scanf("%d%d",&i,&j);
addedge(i,j,i==j?inf:distance(a[i],b[i],a[j],b[j]));
}
k=zhuliu(1);
if(k<0)
printf("poor snoopy\n");
else
printf("%.2f\n",k);
}
return 0;
}
poj 3164 最小树形图模板!!!的更多相关文章
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
- poj 3164 最小树形图
思路:就是裸的最小树形图~ #include<iostream> #include<cstdio> #include<cstring> #include<cm ...
- 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(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- 最小树形图模板 UVA11183
题意:给定n个节点m条边的有向带权图,求以0为根节点的最小树形图权值大小 用这个代码的时候要注意,这里的数据是从0开始的,边也是从0开始算, 所以在打主代码的时候,如果是从1开始,那么算法里面的从0开 ...
- poj 3164 Command Network(最小树形图模板)
Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS Memory Limit: 131072K Total Subm ...
随机推荐
- P2339 提交作业usaco(区间dp)
P2339 提交作业usaco 题目背景 usaco 题目描述 贝西在哞哞大学选修了 C 门课,她要把所有作业分别交给每门课的老师,然后去车站和同学们一起回家.每个老师在各自的办公室里,办公室要等他们 ...
- jwt的应用生成token,redis做储存
解释一下JWT JWT就是一个字符串,经过加密处理与校验处理的字符串,由三个部分组成.基于token的身份验证可以替代传统的cookie+session身份验证方法.三个部分分别如下: header. ...
- 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)
大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...
- Snackbar:用它来替换Toast 显示短提示
简介 Snackbar 它是Toast的子类.主要用来提示短暂的提示信息后,然后它自动消失. 它寄生在普通view上,具有一些基本功能. 它寄生在 CoordinatorLayout 时,有以下两个特 ...
- Elasticsearch--建议器
目录 可用的建议器类型 term建议器 term建议器的配置选项 phrase建议器 completion建议器 在考虑性能的情况下,允许用户的拼写错误,以及构建一个自动完成功能 可用的建议器类型 t ...
- Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)
这一系列博文都是:(android高仿系列)今日头条 --新闻阅读器 (一) 开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉 ...
- Python中深拷贝与浅拷贝的区别
转自:http://blog.csdn.net/u014745194/article/details/70271868 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给 ...
- PAT甲级考前整理(2019年3月备考)之一
转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...
- vps 虚拟服务器 教程 ( Virtual Private Server 虚拟专用服务器 )
VPS是虚拟服务器的意思.他是通过软件在独立服务器上划分出来的一部分资源.从而虚拟出一个服务器.他拥有独立的IP.独立的操作系统.以及用户名和密码.在功能和使用方法上与服务器一模一样.用户也可以根据自 ...
- Jmeter之JDBC请求参数化(二)
二.上面已经讲了一些基本的配置,和简单的jdbc请求,下面来看下具体的如何将查询语句参数化. 参数化这里有几种方法,foreach,计数器,csv等,这里介绍几种方法.