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 ...
随机推荐
- dump函数
一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全没有参数时,直接返回null.另外 ...
- shell 指令分析nginx 日志qps
实时分析 tail -f points.api.speiyou.cn.access.log|awk 'BEGIN{key="";cnt=0}{if(key==$5){cnt++}e ...
- 【不知道是啥的NOIP模拟赛】网络入侵
题意是这样的: 给你一棵树,每个边有一个初始的0/1边权.你希望把它弄成一个给定的样子. 你每次可以选一条树链取反,然后问你最少要操作几次. ----------------------------- ...
- js自定义鼠标右键菜单
document.oncontextmenu = function(e) { return false; } document.onmousedown = function(e) { switch(e ...
- 使用qshell备份七牛云存储文件
qshell是利用七牛文档上公开的API实现的一个方便开发者测试和使用七牛API服务的命令行工具.我们可以利用它来将七牛云上存储的文件备份到本地. 它提供Mac OSX, Linux, Windows ...
- linux定时任务-cron
/sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 ...
- require和import的区别
require:是一种common协议,大家按照这个约定书写自己的代码,实现模块化. import:是ES6的模块语法实现.是语言自身的模块实现.
- Codeforces 931D Peculiar apple-tree(dfs+思维)
题目链接:http://codeforces.com/contest/931/problem/D 题目大意:给你一颗树,每个节点都会长苹果,然后每一秒钟,苹果往下滚一个.两个两个会抵消苹果.问最后在根 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- Android开发——子线程操作UI的几种方法(待续)
方法2 Handler andler mHandler = new Handler() { @Override public void handleMessage(Message msg) { su ...