朱刘算法

步骤:

  1、计算出每个点边权最小的边的权(如果除根以外有其他的点没有入边,则不存在最小树形图),并记下边的另一个端点(称其为这个点的前趋)

  2、沿着每个点向上走,如果在走到根或环上的点之前,就遇到走过的点,那么就出现环了。将环上的点标记一下当前环的编号,并将环上的所有边的边权加在答案里。

  3、如果在2中没有找到环,将当前图除了根以外对应的点的最小入边边权加在答案里,然后返回答案。

  4、否则,将剩下的点标号,并标记为非环点,将所有边两端的点的编号换成对应环的编号,如果目标点是一个环,将边权减少目标点对应的环中的最小入边权。

复杂度:最坏O(N^3)

 #include <cstdio>
#include <cmath>
#include <vector>
#define oo 1e20
#define N 110
#define M 10100
using namespace std; struct Edge {
int u, v;
double w;
Edge(){}
Edge( int u, int v, double w ):u(u),v(v),w(w){}
}; int n, m;
double pts[N][];
int idx[N], vis[N], pre[N], inc[N];
double inw[N];
Edge edge[M]; double getdis( int u, int v ) {
int dx = pts[u][]-pts[v][];
int dy = pts[u][]-pts[v][];
return sqrt(dx*dx+dy*dy);
}
double diricted_mst( int root ) {
double rt = 0.0;
while() {
//---
for( int i=; i<=n; i++ )
inw[i] = oo;
for( int i=; i<m; i++ ) {
Edge &e = edge[i];
if( e.u==e.v ) continue;
if( inw[e.v]>e.w ) {
inw[e.v]=e.w;
pre[e.v]=e.u;
}
}
for( int i=; i<=n; i++ )
if( inw[i]==oo && i!=root )
return -1.0;
//---
for( int i=; i<=n; i++ )
vis[i] = idx[i] = ;
int cnt = ;
for( int u=,v,s; u<=n; u++ ) {
if( u==root ) continue;
for( v=pre[u]; v!=root && !idx[v] && vis[v]!=u; v=pre[v] )
vis[v] = u;
if( v==root || idx[v] ) continue;
cnt++;
s = v;
for( v=pre[s]; v!=s; v=pre[v] ) {
inc[v] = true;
idx[v] = cnt;
rt += inw[v];
}
inc[s] = true;
idx[s] = cnt;
rt += inw[s];
}
if( cnt== ) {
for( int u=; u<=n; u++ )
if( u!=root )
rt += inw[u];
break;
}
for( int u=; u<=n; u++ )
if( !idx[u] ) {
inc[u] = false;
idx[u]=++cnt;
}
//---
for( int i=; i<m; i++ ) {
Edge &e=edge[i];
if( inc[e.v] ) e.w-=inw[e.v];
e.u = idx[e.u];
e.v = idx[e.v];
}
root = idx[root];
n = cnt;
}
return rt;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
for( int i=; i<=n; i++ )
scanf( "%lf%lf", &pts[i][], &pts[i][] );
for( int i=,u,v; i<m; i++ ) {
scanf( "%d%d", &u, &v );
edge[i] = Edge(u,v,getdis(u,v));
}
double ans = diricted_mst();
if( ans<0.0 ) printf( "poor snoopy\n" );
else printf( "%.2f\n", ans );
}
}

poj 3164的更多相关文章

  1. POJ 3164 Command Network (最小树形图)

    [题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...

  2. poj 3164 Command Network

    http://poj.org/problem?id=3164 第一次做最小树形图,看着别人的博客写,还没弄懂具体的什么意思. #include <cstdio> #include < ...

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

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

  4. poj 3164 Command Network(最小树形图模板)

    Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS   Memory Limit: 131072K Total Subm ...

  5. poj 3164(最小树形图模板)

    题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...

  6. poj 3164 Command Network (朱刘算法)

    题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...

  7. POJ 3164——Command Network——————【最小树形图、固定根】

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 15080   Accepted: 4331 ...

  8. POJ 3164 Command Network 最小树形图模板

    最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...

  9. POJ 3164 Command Network 最小树形图

    题目链接: 题目 Command Network Time Limit: 1000MS Memory Limit: 131072K 问题描述 After a long lasting war on w ...

  10. poj 3164 最小树形图

    思路:就是裸的最小树形图~ #include<iostream> #include<cstdio> #include<cstring> #include<cm ...

随机推荐

  1. accept系统调用

    /* * For accept, we attempt to create a new socket, set up the link * with the client, wake up the c ...

  2. Tslib移植与分析【转】

    转自:http://blog.csdn.net/water_cow/article/details/7215308 目标平台:LOONGSON-1B开发板(mips32指令集)编译平台:x86PC-- ...

  3. 转载: Android开源库V - Layout:淘宝、天猫都在用的UI框架,赶紧用起来吧!

    阿里的UI库... 分析的很精辟... http://blog.csdn.net/carson_ho/article/details/71077193

  4. Android调试大法 自定义IDE默认签名文件==>微信支付、微信登录、微信分享,debug时调试通过,release时调不起微信

    转载地址:http://blog.yanzhenjie.com Android调试大法之自定义IDE默认签名文件,你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在d ...

  5. 25 The Go image/draw package go图片/描绘包:图片/描绘包的基本原理

    The Go image/draw package  go图片/描绘包:图片/描绘包的基本原理 29 September 2011 Introduction Package image/draw de ...

  6. Windows 10安装uWSGI:不可行、失败了

    Windows 10家庭中文版,Python 3.6.4,uwsgi-2.0.17.tar.gz,压缩工具-7-zip 提示:请不要和我一样尝试,浪费时间,去Linux上玩吧! 几个小时的安装经历 昨 ...

  7. 第一个Django项目:HelloWorld

    OS:Windows家庭中文版, Python:3.6.3,Django:2.0.3 在前一篇文章中,Django已经顺利安装到了Python中,下面,开发第一个Python项目吧! 1.django ...

  8. MySQL学习笔记:case when

    一.MySQL case when的三种用法: 1.case 字段 when, 字段的具体值: select a.*, case sex when '1' then '男' else '女' end ...

  9. Effective STL 学习笔记14: Use reserve to avoid unnecessary reallocations.

    vector 和 string 容器在动态插入一个新的对象时,如果容器内空间不够,该容器会: 重新分配空间 通常的做法是分配当前 Capacity 大小两倍的空间. 将旧空间中的所有元素拷贝进新的空间 ...

  10. HBase 入门笔记-数据落地篇

    一.前言 关于数据落地方面,HBase官网也有相关介绍.本文主要介绍一下实际工作中涉及的数据存储方面的一些经验和技巧,主要涉及表rowkey设计.数据落地方案 二.表设计 相对于MySQL等关系型数据 ...