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 ...
随机推荐
- 减少Android staido 占用C 盘
1.gradle 更换文件夹: 设置GRADLE_USER_HOME环境变量 在/etc/profile或~/.bash_profile增加如下: export GRADLE_USER_HOME=D: ...
- startActivityForResult 请求码不正确
今天遇到一个坑,就是 startActivityForResult 接收不到正确的请求码. 比如,我startActivityForResult的时候,设置的请求码是4,但是接收到的时候是100032 ...
- 使用自己的类来作为hashtable的主键
import java.util.*; class Counter { } class Groundhog2 { int ghNumber; Groundhog2(int n) { ghNumber ...
- quick sort去除无用判断
#include <stdio.h> #include <stdlib.h> //int a[]={1000,10000,9,10,30,20,50,23,90,100,10} ...
- 。net可以点出属性,编译没问题,运行时就报错了。一笔记。
项目框架是这样的. 在 domain(你可以把它理解为你的bll) ,web 2个项目工程里面都引用了一个通过nuget管理程序包,比如 xxcommon.dll web 引用了 domain ,然后 ...
- python3 打印九九乘法口诀表
for i in range(1, 10): for j in range(1, i+1): # print(f'{i}×{j}={i*j}', end='\t') print('%d×%d=%d' ...
- CTF python沙箱逃逸进阶题目
future引用了python3的新特性,所以是不能直接回回显,得用print file函数可以读取. print(().__class__.__bases__[0].__subclasses__() ...
- HTML DOM简易学习笔记
文字版:https://github.com/songzhenhua/github/blob/master/HTML DOM简易学习笔记.txt 学习地址:http://www.w3school.co ...
- ironic baremetal node rescue/unrescue mode
环境ironic-api ironic-conductor,ironicclient均升级为Queens版本 官网说明API版本为1.38才支持rescue/unrescue,所以修改下openrc文 ...
- sklearn中predict()与predict_proba()用法区别
predict是训练后返回预测结果,是标签值. predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行 ...