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 ...
随机推荐
- __call__
object.__call__(self[, args...]) Called when the instance is “called” as a function; if this method ...
- Solr创建Core的两种方法
创建Core的两种方法: 第一种方法: 1.打开dos命令窗口,切换目录到${solr.home}\bin,然后输入:solr create -c corename之后回车: 2.打开solr安装文件 ...
- 使用Numpy将数据集中的data和target同时shuffle
假设现在有图像数据imgs和对应标签targets.数据维度分别如下 imgs.shape = (num, channel, width, height) targets.shape = (num, ...
- python正则下载图片
import urllib.request import re # 打开图片路径 def open_url(url): #设置请求路径 req = urllib.request.Request(url ...
- android xml组建圆角背景设置
1.实现左边圆角,右边直行的方法: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:a ...
- kali2.0的初始设置
1.修改源 leafpad /etc/apt/sources.list 加kali源 deb http://http.kali.org/kali kali-rolling main non-free ...
- 析构函数 声明为protected
1.如果一个类被继承,同时定义了基类以外的成员对象,且基类析构函数不是virtual修饰的, 那么当基类指针或引用指向派生类对象并析构(例如自动对象在函数作用域结束时:或者通过delete)时,会调用 ...
- cei()、linspace()、arrange()、full()、eye()、empty()、random()
1.np.ceil()函数 np.ceil()函数为朝正无穷方向取整 a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0]) print(np.cei ...
- CAN总线芯片SN65HVD230QD介绍
CAN总线硬件电路如上,采用芯片为SN65HVD230QD,从TI获得的芯片手册,可知该芯片参数为: 3.3V供电 低电流为370uA典型值
- vmware启动虚拟机发现没权限
前期安装未参与,但了解大致情况: 物理机上安装CentOS7系统,然后安装VMWare,虚拟了几台CentOS6 遇到的问题:物理机重启后,以root进入系统,但打开VMWare显示是普通用户权限,以 ...