poj 3164(最小树形图模板)
题目链接: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(最小树形图模板)的更多相关文章
- poj 3164 最小树形图模板!!!
/* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...
- poj 3164 最小树形图
思路:就是裸的最小树形图~ #include<iostream> #include<cstdio> #include<cstring> #include<cm ...
- HDU 2121 Ice_cream’s world II 最小树形图 模板
开始学习最小树形图,模板题. Ice_cream’s world II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32 ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- poj3164最小树形图模板题
题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...
- hdu 4009 最小树形图模板题朱刘算法
#include<stdio.h> /*思路:显然对于每个地方, 只有一种供水方式就足够了,这样也能保证花费最小, 而每个地方都可以自己挖井,所以是不可能出现无解的情况的, 为了方便思考, ...
- 最小树形图模板 UVA11183
题意:给定n个节点m条边的有向带权图,求以0为根节点的最小树形图权值大小 用这个代码的时候要注意,这里的数据是从0开始的,边也是从0开始算, 所以在打主代码的时候,如果是从1开始,那么算法里面的从0开 ...
- poj 3164 Command Network(最小树形图模板)
Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS Memory Limit: 131072K Total Subm ...
随机推荐
- git 设置别名 git alias
git config --global alias.st status git config --global alias.ck checkout git config --global alias. ...
- Android 如何在xmL 里面动态设置padding
如题,Android 如何在xmL 里面动态设置padding 有时候,你的布局加载完成之后,你findViewByid 找到控件,设置padding 会导致白条,布局闪动,那怎么办呢? 你是不是就想 ...
- Monkey、Monkeyrunner之间的区别
Monkey.Monkeyrunner之间的区别 一.Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输 ...
- win10 64位 C# 连接oracle 32位, 遇到的问题及解决
首次 本机电脑是win10系统 64位的:安装的oracle数据库也是64位的: 服务器端的oracle 是32位的: 第一次安装的pl/sql 也是64位的, 配置完 F:\app\ln_qi\p ...
- 【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)
如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader ...
- (原)Unreal渲染模块 管线 - 程序和场景查询
@author: 白袍小道 查看随意,转载随缘 第一部分: 这里主要关心加速算法,和该阶段相关的UE模块的结构和组件的处理. What-HOW-Why-HOW-What(嘿嘿,老规矩) 1.渲 ...
- rownum浅谈(一)
只要做web开发,几乎没有不需要分页查询的,在oracle中,rownum就是用来进行处理分页的. 1.rownum是oracle对结果集返回的一个伪列,也就是说是先查询完结果之后再加上的一个虚列,相 ...
- shell sort 排序大讨论
转自http://roclinux.cn 本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. === [正文开始]有时候学 ...
- .export*读取图片
*读取图片 read_image(Image,'D:/MyFile/halcon/数字识别/1.jpg define PHYS_FLASH2_1 0xBC000000 /* Image2 Bank # ...
- asp.net连接SQL server,SQLLite,Oracle,Access数据库
asp.net中连接数据库有两种方式为appSettings和connectionStrings connectionStrings比较常用,所以只讲一下connectionStrings方式的连接 ...