/*

思路很简单,也不知道哪里错了TAT

*/

/*
N个点通过笛卡尔坐标表示
根节点是1,求最小树形图
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
struct Edge{
int u,v;
double cost;
Edge(int uu=,int vv=,double cc=0.0):u(uu),v(vv),cost(cc){}
}edge[MAXN*MAXN];
struct node{
int x,y;
}nodes[MAXN];
double dist(int u,int v){
return sqrt((double)(nodes[u].x-nodes[v].x)*(nodes[u].x-nodes[v].x)+
(nodes[u].y-nodes[v].y)*(nodes[u].y-nodes[v].y));
}
int pre[MAXN],id[MAXN],vis[MAXN];
double in[MAXN];
double zhuliu(int root, int nv, int ne)
{
double ans = ;
int u, v, i, cnt;
while(true){
//0.初始化
for(i = ; i <= nv; ++i) in[i] = INF;
//1.找最小入边集
for(i = ; i <= ne; ++i){
u = edge[i].u; v = edge[i].v;
if(edge[i].cost < in[v] && u != v){
in[v] = edge[i].cost; pre[v] = u;
}
}
for(i = ; i <= nv; ++i)
if(in[i]==INF && i!=root)
return -;
//2.找非根无入边点(略),因为必定有解
//3.找环,加权,重新标号
memset(id, -, sizeof(id));
memset(vis, -, sizeof(vis));
cnt = in[root] = ;
for(i = ; i <= nv; ++i){
ans += in[i]; v = i;
while(vis[v] != i && v != root && id[v] == -){
vis[v] = i; v = pre[v];
}
if(v != root && id[v] == -){
for(u = pre[v]; u != v; u = pre[u])
id[u] = cnt;
id[v] = cnt++;
}
}
if(cnt == ) break; //无环,算法完成
for(i = ; i <= nv; ++i)
if(id[i] == -) id[i] = cnt++;
//4.缩点,遍历每一条边,重新构图
for(i = ; i <= ne; ++i){
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].cost -= in[v];
}
//顶点数减少
nv = cnt; root = id[root];
}
return ans;
}
int main(){
int n,m,u,v;
while(scanf("%d%d",&n,&m)==){
for(int i=;i<=n;i++)
scanf("%d%d",&nodes[i].x,&nodes[i].y);
int totm=;
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
if(u!=v)
edge[++totm]=Edge(u,v,dist(u,v));
}
int root=;
double res=zhuliu(root,n,totm);
if(res==-)
puts("poor snoopy");
else
printf("%.2lf\n",res);
}
return ;
}

poj3164 最小树形图板子题的更多相关文章

  1. hdu4009最小树形图板子题

    /*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...

  2. poj3164最小树形图模板题

    题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...

  3. poj3164(最小树形图&朱刘算法模板)

    题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...

  4. 最小割板子题——[USACO5.4]奶牛的电信

    今天邱神给我们讲了图论,还讲了一下网络流算法.自己找了一个洛谷板子题. 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果 ...

  5. POJ 3164 Command Network(最小树形图模板题+详解)

    http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...

  6. hdu 4009 最小树形图模板题朱刘算法

    #include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...

  7. uva11183 最小树形图模板题

    很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...

  8. 【刷题】洛谷 P4716 【模板】最小树形图

    题目背景 这是一道模板题. 题目描述 给定包含 \(n\) 个结点, \(m\) 条有向边的一个图.试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\ ...

  9. bzoj4349: 最小树形图

    最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...

随机推荐

  1. Hibernate持久化

    一.主键生成策略 1)主键分类:1.自然主键:主键本身就是表中的某一个字段,实体中的一个具体属性,对象本身唯一的特性. 例如:创建一个学生,把其身份证号设为主键 2.代理主键:本身不是表中的一个必须的 ...

  2. 基于【磁盘】操作的IO接口:File

    基本操作Api import org.apache.commons.lang3.time.DateFormatUtils; import java.io.*; import java.util.Dat ...

  3. mongodb系列~mongodb定时删除数据

    一 简介:本文介绍创建自动删除数据的TTL索引 二 目的 定时删除数据三 创建方法   db.collection.createIndex(keys, options)   options:   ex ...

  4. MongpDB 学习手册 - 索引

    //查看数据库以及容量 // show dbs //查看有哪些数据表 // show collections // MongoDB 索引 // 索引通常能够极大的提高查询的效率,如果没有索引,Mong ...

  5. openstack Q版部署-----keystone认证服务安装配置(3)

    一.新建数据库及用户(控制节点) 登录数据库,创建db以及用户: CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'ke ...

  6. Zookeeper学习笔记1

    参考:从Paxos到Zookeeper分布式一致性原理与实践 从ACID到CAP/BASE ACID 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库 ...

  7. P5270 无论怎样神树大人都会删库跑路

    题目地址:P5270 无论怎样神树大人都会删库跑路 第一眼看上去是模拟,似乎是 \(O(n)\) 的 水题 信心满满的写完: #include <bits/stdc++.h> using ...

  8. P3168 [CQOI2015]任务查询系统

    题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...

  9. 使用多线程提高Rest服务性能

    ⒈使用Runnable异步处理Rest服务 /** *使用Runnable异步处理Rest服务 * @return */ @GetMapping("/order") public ...

  10. Angular 创建组件

    创建组件 0 命令创建 1 创建组件 定义hello.component.ts组件 在app.module.ts中引用并添加到declarations声明中 在app.component.html中使 ...