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 ...
随机推荐
- Category的真相
Objective-C 中的 Category 就是对设计模式中装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法. 使用场景 根据苹果官方文档对 Categor ...
- 这个写法会出什么问题: @property (copy) NSMutableArray *array;
因为copy策略拷贝出来的是一个不可变对象,然而却把它当成可变对象使用,很容易造成程序奔溃 //如:-[__NSArrayI removeObjectAtIndex:]: unrecognized s ...
- 《Cracking the Coding Interview》——第1章:数组和字符串——题目8
2014-03-18 02:12 题目:判断一个字符串是否由另一个字符串循环移位而成. 解法:首先长度必须相等.然后将第一个串连拼两次,判断第二个串是否在这个连接串中. 代码: // 1.8 Assu ...
- USACO Section1.2 Name That Number 解题报告
namenum解题报告 —— icedream61 博客园(转载请注明出处)-------------------------------------------------------------- ...
- USACO Section1.1 Broken Necklace 解题报告
beads解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- Java EE - Servlet 小结
Table of Contents 前言 Servlet 的生命周期 Servlet 的初始化 ServletContext & ServletConfig 请求的处理 HttpServlet ...
- 抓包工具 - Fiddler - (一)
<转载于 miantest> Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888 ...
- Java进制间的转换
最近学习了Java间的进制转换,记录下自己的学习心得,希望可以帮到前来查看的朋友们,如果有不懂的地方可以在下方评论留言,我们一起学习进步,只有自己足够强大才能弥补不足,多学习, 任意进制到十进制的转换 ...
- OpenStack Heat 介绍
Heat 是一个基于模板来编排复合云应用的服务. 它目前支持亚马逊的 CloudFormation 模板格式,也支持 Heat 自有的 Hot 模板格式.模板的使用简化了复杂基础设施,服务和应用的定义 ...
- HDU 3874 Necklace 树状数组
题意:求区间内不同的数的和 离线处理,按查询右端点从小到大排序,从左往右扫一遍. 记录每个数出现的上一个位置,如果该数之前没有出现过,就加上,否则就在上一个位置减去. #include <cst ...