题目链接:http://poj.org/problem?id=3164

详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/2596851.html

我没怎么看懂 = =,姑且做个模板了。。

题意就是给n个点,m条单向边,并且已知根节点,求有向图的最小生成树。

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef double type;
const int N = ;
const int M = ;
const type INF = ;
struct Point
{
int x,y;
} p[N];
struct Edge
{
int u,v;
double cost;
} edge[M];
///最小树形图算法
type IN[N];
int vis[N],pre[N],id[N];
type Directed_MST(int root,int n,int m) ///n为点数,m为边数
{
type cost = ;
while(true)
{
///找最小入边
for(int i=; i<n; i++) IN[i] = INF;
for(int i=; i<m; i++)
{
int u = edge[i].u,v = edge[i].v;
if(edge[i].cost<IN[v]&&u!=v)
{
pre[v]=u,IN[v]=edge[i].cost;
}
}
for(int i=; i<n; i++) ///判断是否有最小树形图(除了root之外还存在点没有入边)
{
if(i==root) continue;
if(IN[i]==INF) return -;
}
///找环
int cnt = ; ///环的计数器
memset(id,-,sizeof(id));
memset(vis,-,sizeof(vis));
IN[root] = ;
for(int i=; i<n; i++)
{
cost +=IN[i];
int v = i;
while(vis[v]!=i&&id[v]==-&&v!=root) ///往前找判断是否成环或者找到根
{
vis[v]=i;
v = pre[v];
}
if(v != root && id[v] == -)///缩点
{
for(int u = pre[v]; u != v; u = pre[u]) id[u] = cnt;
id[v] = cnt++;
}
}
if(cnt==) break; ///无环了
for(int i=; i<n; i++)
{
if(id[i]==-) id[i]=cnt++;
}
///建立新图
for(int i = ; i < m; i++)
{
int u = edge[i].u;
int v = edge[i].v;
edge[i].u = id[u];
edge[i].v = id[v];
if(id[u] != id[v]) edge[i].cost -= IN[v];
}
n = cnt;
root = id[root];
}
return cost;
}
double dis(Point a,Point b)
{
return sqrt(1.0*((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=; i<n; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=; i<m; i++)
{
scanf("%d%d",&edge[i].u,&edge[i].v);
edge[i].u--,edge[i].v--;
if(edge[i].u==edge[i].v) edge[i].cost = INF; ///除去自环
else edge[i].cost = dis(p[edge[i].u],p[edge[i].v]);
}
double cost = Directed_MST(,n,m);
if(cost==-) printf("poor snoopy\n");
else printf("%.2lf\n",cost);
}
}

poj 3164(最小树形图模板)的更多相关文章

  1. poj 3164 最小树形图模板!!!

    /* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...

  2. poj 3164 最小树形图

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

  3. HDU 2121 Ice_cream’s world II 最小树形图 模板

    开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

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

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

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

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

  6. poj3164最小树形图模板题

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

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

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

  8. 最小树形图模板 UVA11183

    题意:给定n个节点m条边的有向带权图,求以0为根节点的最小树形图权值大小 用这个代码的时候要注意,这里的数据是从0开始的,边也是从0开始算, 所以在打主代码的时候,如果是从1开始,那么算法里面的从0开 ...

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

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

随机推荐

  1. 路由vue-router进阶

    目录 1. 导航守卫 1.1. 全局守卫 1.2. 全局解析守卫 1.3. 全局后置钩子 1.4. 路由独享的守卫 1.5. 组件内的守卫 1.6. 完整的导航解析流程 2. 路由元信息 3. 获取数 ...

  2. Android如何实现毛玻璃效果之Android高级模糊技术

    自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 效果我们知道了,如何在Android中实现呢, ...

  3. HTML5 FileReader接口学习笔记

    1.FileReader概述 FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据. 其中F ...

  4. 孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1

    孤荷凌寒自学python第六十二天学习mongoDB的基本操作并进行简单封装1 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第八天. 今天开始学习mongoDB的简单操作, ...

  5. sqlserver 列出表字段和字段说明

    --表描述SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties dsLEFT JOIN sysobjects tbs ON ds.ma ...

  6. Android之SeekBar总结(一)

    2015-04-24 SeekBar: 一种特殊的进度条,包含一个滑块用于调节进度值. API 中目录结构如下: 包含几种特殊的属性: 1: max:设置进度条的最大值 .对应方法:setMax(in ...

  7. Linux再谈互斥锁与条件变量

    原文地址:http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait总和一个互斥锁结合使用.在调用pthread_ ...

  8. STL之算法使用简介

    accumlate : iterator 对标志的序列中的元素之和,加到一个由 init 指定的初始值上.重载的版本不再做加法,而是传进来的二元操作符被应用到元素上.  adjacent_differ ...

  9. linux备忘录-bash

    知识点 环境变量 HOME PATH MAIL SHELL RANDOM // 0~32767的随机数 declare -i number=$RANDOM*10/32768 //0-9的随机数 HIS ...

  10. linux中帮助参数 man whatis which info区别?

    在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档: linux系统内置的帮助文档很详细,通常能解决我们的问题,我们需要掌握如何正确的去使用它们: 在只记 ...