poj 3164
朱刘算法
步骤:
1、计算出每个点边权最小的边的权(如果除根以外有其他的点没有入边,则不存在最小树形图),并记下边的另一个端点(称其为这个点的前趋)
2、沿着每个点向上走,如果在走到根或环上的点之前,就遇到走过的点,那么就出现环了。将环上的点标记一下当前环的编号,并将环上的所有边的边权加在答案里。
3、如果在2中没有找到环,将当前图除了根以外对应的点的最小入边边权加在答案里,然后返回答案。
4、否则,将剩下的点标号,并标记为非环点,将所有边两端的点的编号换成对应环的编号,如果目标点是一个环,将边权减少目标点对应的环中的最小入边权。
复杂度:最坏O(N^3)
#include <cstdio>
#include <cmath>
#include <vector>
#define oo 1e20
#define N 110
#define M 10100
using namespace std; struct Edge {
int u, v;
double w;
Edge(){}
Edge( int u, int v, double w ):u(u),v(v),w(w){}
}; int n, m;
double pts[N][];
int idx[N], vis[N], pre[N], inc[N];
double inw[N];
Edge edge[M]; double getdis( int u, int v ) {
int dx = pts[u][]-pts[v][];
int dy = pts[u][]-pts[v][];
return sqrt(dx*dx+dy*dy);
}
double diricted_mst( int root ) {
double rt = 0.0;
while() {
//---
for( int i=; i<=n; i++ )
inw[i] = oo;
for( int i=; i<m; i++ ) {
Edge &e = edge[i];
if( e.u==e.v ) continue;
if( inw[e.v]>e.w ) {
inw[e.v]=e.w;
pre[e.v]=e.u;
}
}
for( int i=; i<=n; i++ )
if( inw[i]==oo && i!=root )
return -1.0;
//---
for( int i=; i<=n; i++ )
vis[i] = idx[i] = ;
int cnt = ;
for( int u=,v,s; u<=n; u++ ) {
if( u==root ) continue;
for( v=pre[u]; v!=root && !idx[v] && vis[v]!=u; v=pre[v] )
vis[v] = u;
if( v==root || idx[v] ) continue;
cnt++;
s = v;
for( v=pre[s]; v!=s; v=pre[v] ) {
inc[v] = true;
idx[v] = cnt;
rt += inw[v];
}
inc[s] = true;
idx[s] = cnt;
rt += inw[s];
}
if( cnt== ) {
for( int u=; u<=n; u++ )
if( u!=root )
rt += inw[u];
break;
}
for( int u=; u<=n; u++ )
if( !idx[u] ) {
inc[u] = false;
idx[u]=++cnt;
}
//---
for( int i=; i<m; i++ ) {
Edge &e=edge[i];
if( inc[e.v] ) e.w-=inw[e.v];
e.u = idx[e.u];
e.v = idx[e.v];
}
root = idx[root];
n = cnt;
}
return rt;
}
int main() {
while(~scanf("%d%d",&n,&m)) {
for( int i=; i<=n; i++ )
scanf( "%lf%lf", &pts[i][], &pts[i][] );
for( int i=,u,v; i<m; i++ ) {
scanf( "%d%d", &u, &v );
edge[i] = Edge(u,v,getdis(u,v));
}
double ans = diricted_mst();
if( ans<0.0 ) printf( "poor snoopy\n" );
else printf( "%.2f\n", ans );
}
}
poj 3164的更多相关文章
- POJ 3164 Command Network (最小树形图)
[题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...
- poj 3164 Command Network
http://poj.org/problem?id=3164 第一次做最小树形图,看着别人的博客写,还没弄懂具体的什么意思. #include <cstdio> #include < ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- poj 3164 Command Network(最小树形图模板)
Command Network http://poj.org/problem?id=3164 Time Limit: 1000MS Memory Limit: 131072K Total Subm ...
- poj 3164(最小树形图模板)
题目链接:http://poj.org/problem?id=3164 详细可以看这里:http://www.cnblogs.com/vongang/archive/2012/07/18/259685 ...
- poj 3164 Command Network (朱刘算法)
题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...
- 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 最小树形图
思路:就是裸的最小树形图~ #include<iostream> #include<cstdio> #include<cstring> #include<cm ...
随机推荐
- 【洛谷题解】P2303 [SDOi2012]Longge的问题
题目传送门:链接. 能自己推出正确的式子的感觉真的很好! 题意简述: 求\(\sum_{i=1}^{n}gcd(i,n)\).\(n\leq 2^{32}\). 题解: 我们开始化简式子: \(\su ...
- unity 优秀开源项目
ihaiu.GUIDRef (查看项目资源使用情况) http://blog.ihaiu.com/unity-GUIDRef Ihaiu.PoolManager (对象池) http://github ...
- python之uinttest,用例执行顺序
unittest单元测试框架, 以test开头的测试用例,默认执行顺序是按照ASC码来执行 如果有类,先排序执行类,在执行类中,再排序用例顺序执行 如果想要按照指定的顺序执行测试用例. 那么就需要用到 ...
- ROS新动态获取网址汇总
ROS新动态获取网址汇总 1 planet ROS http://planet.ros.org/ 2 ROS news http://www.ros.org/news/ 3 ROS-Industria ...
- master..xp_fileexist
declare @sql varchar(800) set @sql='E:\temp.dbf'create table #tb(a bit,b bit,c bit) insert into #t ...
- 最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)
其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSF ...
- 【转】Android开启网络调试的方法
方法是偶然看到的: Android 终端adbd服务需要开启5555号端口来建立于adb的连接,如果未开启5555端口,则不能通过网络调试 查看是否可以网络调试: # netstat Android ...
- ASP.NET MVC之Ajax如影随行
一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢?<舌尖上的中国>大家都看了,那些美食估计你是百看不厌,但是里边我觉得其实也有这样的一个哲学:关于食材,对于种 ...
- Django实战(4):scaffold生成物分析
在上一节用一个插件生成了类似rails的scaffold,其实无非就是URLconf+MTV.让我们看看具体都生成了哪些东西. 首先是“入口”的定义即URLconf,打开urls.py: from d ...
- JSP的学习二(请求转发与 重定向)
一: 1.介绍知识点 1). 本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求. 具体: ①. 请求的转发: 地址栏是初次发出请求的地址. 请求的重定向: 地址栏不再是初次发出的请 ...