poj3164 最小树形图板子题
/*
思路很简单,也不知道哪里错了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 最小树形图板子题的更多相关文章
- hdu4009最小树形图板子题
/*调了一下午的最小树形图,昨天刚刚看懂模板..最小树形图,就是有向图的最小生成树,很神奇==*/ #include<iostream> #include<cstring> # ...
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- poj3164(最小树形图&朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- 最小割板子题——[USACO5.4]奶牛的电信
今天邱神给我们讲了图论,还讲了一下网络流算法.自己找了一个洛谷板子题. 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果 ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- uva11183 最小树形图模板题
很简单的模板题,不多说了 #include<iostream> #include<cstring> #include<cstdio> #define INF 0x3 ...
- 【刷题】洛谷 P4716 【模板】最小树形图
题目背景 这是一道模板题. 题目描述 给定包含 \(n\) 个结点, \(m\) 条有向边的一个图.试求一棵以结点 \(r\) 为根的最小树形图,并输出最小树形图每条边的权值之和,如果没有以 \(r\ ...
- bzoj4349: 最小树形图
最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...
随机推荐
- 【mmall】递归查询子节点并排重
代码 @Override public ServerResponse getSelfAndChildrenCategory(Integer categoryId) { if (categoryId ! ...
- 阿里云上 配置 vsftpd 配置文件 (一个成功例子)
# # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsft ...
- Springboot 配置 ssl 实现HTTPS 请求 & Tomcat配置SSL支持https请求
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议.TLS与 ...
- js变量的解构赋值
今天在学习时看到几段代码,让我感叹JS的灵活,特此一记: let stateObj = {a:1,b:3}; let newObj = {b:13,c:4} ; stateObj = {...stat ...
- aiohttp的笔记之TCPConnector
TCPConnector维持链接池,限制并行连接的总量,当池满了,有请求退出再加入新请求.默认是100,limit=0的时候是无限制 1.use_dns_cache: 使用内部DNS映射缓存用以查询D ...
- 谈谈asp,php,jsp的优缺点
谈谈asp,php,jsp的优缺点 http://hi.baidu.com/lhyboy/item/f95bac264c38830d72863e41 asp.php.asp.net.jsp等主流网 ...
- C# 读取驱动器盘符及信息
System.IO.DriveInfo[] hardDiskDrives = System.IO.DriveInfo.GetDrives(); foreach (System.IO.DriveInfo ...
- P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?LCT?...FAQ orz
好久没写博客了哈,今天来水一篇._(:з」∠)_ 题目 :弹飞绵羊(一道省选题) 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏 ...
- Python学习前期准备---第九天
一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...
- Unity3D Shader 入门
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这 ...