poj 3164 最小树形图
思路:就是裸的最小树形图~
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define Maxn 110
#define LL double
#define inf 1e9
using namespace std;
int pre[Maxn],id[Maxn],vi[Maxn],num;
LL in[Maxn];
struct Edge{
int u,v;
LL val;
}edge[Maxn*Maxn];
struct Point{
double x,y;
}p[Maxn];
double Dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void add(int u,int v,LL val)
{
edge[num].u=u,edge[num].v=v,edge[num++].val=val;
}
LL directed_MST(int root,int n,int e)
{
int i,j,u,v,cnt=;
LL ans=;
while()
{
for(i=;i<=n;i++) in[i]=inf;
for(i=;i<e;i++)//找最小入边
{
u=edge[i].u;
v=edge[i].v;
if(in[v]>edge[i].val&&v!=u)
{
in[v]=edge[i].val;
pre[v]=u;
}
}
for(i=;i<=n;i++)
{
if(i==root) continue;
if(in[i]==inf) return -;
}
memset(vi,-,sizeof(vi));
memset(id,-,sizeof(id));
cnt=;
in[root]=;
for(i=;i<=n;i++)//枚举每个可能是环上的点
{
ans+=in[i];
v=i;
while(vi[v]!=i&&id[v]==-&&v!=root)
{
vi[v]=i;v=pre[v];
}
if(v!=root&&id[v]==-)//如果退出上个循环的条件不是v==root,就是vi[i]==i,即找到了环
{
id[v]=++cnt;
for(u=pre[v];u!=v;u=pre[u])//对环进行统一标号
id[u]=cnt;
}
}
if(cnt==) break;//无环 ,退出
for(i=;i<=n;i++) if(id[i]==-) id[i]=++cnt;
for(i=;i<e;i++)//进行缩点,并修改每条边的权值。
{
v=edge[i].v;
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
if(edge[i].u!=edge[i].v)
edge[i].val-=in[v];
}
n=cnt;
root=id[root];
}
return ans;
}
int main()
{
int i,j,n,m,a,b;
while(scanf("%d%d",&n,&m)!=EOF)
{
num=;
for(i=;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(a!=b)
add(a,b,Dis(p[a],p[b]));
}
double ans=directed_MST(,n,num);
if(ans==-)
printf("poor snoopy\n");
else
printf("%.2lf\n",ans);
}
return ;
}
poj 3164 最小树形图的更多相关文章
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
- poj 3164 最小树形图模板!!!
/* tle十几次,最后发现当i从1开始时,给环赋值时要注意啊! 最小树形图 */ #include<stdio.h> #include<string.h> #include& ...
- POJ 3164 Command Network (最小树形图)
[题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- POJ 3164——Command Network——————【最小树形图、固定根】
Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 15080 Accepted: 4331 ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- POJ 3164 Command Network 最小树形图
题目链接: 题目 Command Network Time Limit: 1000MS Memory Limit: 131072K 问题描述 After a long lasting war on w ...
- POJ 3164 Command Network ( 最小树形图 朱刘算法)
题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...
- POJ 3164 Command Network 最小树形图 朱刘算法
=============== 分割线之下摘自Sasuke_SCUT的blog============= 最 小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T, ...
随机推荐
- 利用管道实现Shell多进程
shell中有个&,表示该程序在后台执行,其实是fork了一个子进程,跟系统调用是一样的. 在实际的操作过程中,有时需要控制后台程序的个数,毕竟启动太多的后台,会对服务的性能造成影响. 所以需 ...
- HDU 5656 CA Loves GCD (数论DP)
CA Loves GCD 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/B Description CA is a fine c ...
- Linux使用locate命令定位文件
FIND命令 很多Linux用户喜欢使用find命令来查找文件,例如他们通常喜欢这样做: find / -name 'pattern' 确实find的强大功能不仅仅用来查找文件,它能用来定位更加细节的 ...
- Python多线程学习资料1
一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1. 函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...
- socket断开连接的四次握手及常见过程解析
TCP的协议文档对TCP的一些规定:文档名称-RFC793 TCP消息头的控制位 URG:紧急指针字段有效 ACK:确认头部字段有效 PSH:强制函数 RST:重置链接 SYN:同步系列号码 FIN ...
- 剑指OFFER之二维数组中的查找(九度OJ1384)
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1< ...
- MyEclipse10.0 安装 jbpm4.4
马上送上地址:http://sourceforge.net/projects/jbpm/files/jBPM%204/ 偶这里下载的是 jbpm4.4 如图: 1.点击 add site 2.点击 a ...
- 使用Github遇到的问题及解决办法
问题一: 当push代码上去仓库时,出现 ! [rejected] master -> master (fetch first) error: failed to push som ...
- linux 一些遇到的问题
亚马逊云服务器上的YUM源有些问题,是64位系统,安装GCC的时候要用 yum install gcc44 yum install gcc44-c++ 查看源的列表和禁用(开启)源 yum-confi ...
- DuiLib(四)——控件绘制
duilib的所有控件均绘制在唯一的真实窗口之中,本篇就具体看下这个绘制的过程.所有的绘制过程均在WM_PAINT消息处理过程中完成.由窗口及消息篇可以看到,窗口消息处理最终流到了CPaintMana ...