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 ...
随机推荐
- 【算法学习】有旋treap
treap是平衡树的一种.与其他平衡树一样,它也能够支持插入和删除,求第k极值等,接下来我们主要探讨有旋treap的实现过程. treap中每个节点要维护其值,左右孩子以及子树大小.父亲要不要写则看你 ...
- 管道和xargs区别
一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道: 懒蜗牛Gentoo 写道: 管道是实现“将前面的标准输出作为后面的 ...
- C# listView subitem 问本值 text 改变 界面会闪烁
解决方法 就是重写ListView,然后设置双缓冲即可,然后再使用DoubleBufferListView,就不会闪烁了.下面的代码是DoubleBufferListView,并使用FrmMain来测 ...
- No.10 selenium学习之路之通过元素定位获取属性
1. implicitly_wait()隐形等待.等待页面加载完成,作用是全局的. 时间可以设置的长,短时间也没有影响.直到设置的时间耗完 时间耗完也不会报错 2.获取title值 driver.ti ...
- opencv(4)实现数据增加小工具
数据增加(data augmentation),作为一种深度学习中的常用手段,数据增加对模型的泛化性和准确性都有帮助.数据增加的具体使用方式一般有两种,一种是实时增加,比如在Caffe中加入数据扰动层 ...
- (二) Log4j 配置详解
第一节: rootLogger 根配置 Log4j 根配置语法 log4j.rootLogger = [ level ] , appenderName, appenderName, … 指代 把指定级 ...
- 用django-cors-headers做跨域
什么是CORS? CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问. 其实,在服务器的response header ...
- MySQL学习笔记:新增一列
1.在一个已建好的表中,最后一列位置添加一列,可使用: ALTER TABLE aa_numbers_small ADD COLUMN date_time DATE NOT NULL; 2.添加一列到 ...
- PowerMock+SpringMVC整合并测试Controller层方法
PowerMock扩展自Mockito,实现了Mockito不支持的模拟形式的单元测试.PowerMock实现了对静态方法.构造函数.私有方法以及final方法的模拟支持,对静态初始化过程的移除等强大 ...
- 课堂实验-String类和Arrays类
课堂实验 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 sort binarySea ...