POJ-3164 Command Network 最小树形图
题目链接:http://poj.org/problem?id=3164
裸的最小树形图,用朱—刘算法解决,具体实现过程如下:算法一开始先判断从固定根开始是否可达所有原图中的点,若不可,则一定不存在最小树形图。这一步是一个很随便的搜索,写多搓都行,不加废话。第二步,遍历所有的边,从中找出除根结点外各点的最小入边,累加权值,构成新图。接着判断该图是否存在环。若不存在,则该图便是所求最小树型图,当前权为最小权。否则对环缩点,然后回到第二步继续判断。简化就是三个过程:找边—>找环—>缩点;
算法流程图:
参考样例:
代码实现有很多种方法,为了兼顾代码的长度和效率,我选择了O(VE)的写法。
1 //STATUS:C++_AC_110MS_244KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector> 10 #include<queue> 11 #include<stack> 12 using namespace std; 13 #define LL __int64 14 #define pdi pair<double,int> 15 #define Max(a,b) ((a)>(b)?(a):(b)) 16 #define Min(a,b) ((a)<(b)?(a):(b)) 17 #define mem(a,b) memset(a,b,sizeof(a)) 18 #define lson l,mid,rt<<1 19 #define rson mid+1,r,rt<<1|1 20 const int N=110,M=1000000,INF=0x3f3f3f3f,MOD=1999997; 21 const LL LLNF=0x3f3f3f3f3f3f3f3fLL; 22 const double DNF=100000000000; 23 24 struct Node{ 25 double x,y; 26 }nod[N]; 27 struct Edge{ 28 int u,v; 29 double w; 30 }e[N*N]; 31 int pre[N],id[N],vis[N]; 32 double minw[N]; 33 int n,m; 34 35 inline double dist(Node &a,Node &b) 36 { 37 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 38 } 39 40 double zhu_liu(int root) 41 { 42 int i,cou,u,v,k; 43 double ans=0; 44 while(1) 45 { 46 //init 47 mem(pre,-1); 48 for(i=1;i<=n;i++)minw[i]=DNF; 49 for(i=0;i<m;i++){ 50 u=e[i].u; 51 v=e[i].v; 52 if(e[i].w<minw[v] && u!=v){ 53 pre[v]=u; 54 minw[v]=e[i].w; 55 } 56 } 57 pre[root]=-1;minw[root]=0; 58 for(cou=0,i=1;i<=n;i++) 59 if(pre[i]==-1 && i!=root)cou++; 60 else ans+=minw[i]; 61 if(cou)return -1; 62 //cheack the circle 63 mem(vis,0); 64 mem(id,0); 65 for(i=1,k=0;i<=n;i++){ 66 if(id[i])continue; 67 u=i; 68 while(u!=-1 && !id[u] && vis[u]!=i){ 69 vis[u]=i; 70 u=pre[u]; 71 } 72 if(u!=-1 && !id[u] && vis[u]==i){ 73 k++; 74 while(id[u]!=k){ 75 id[u]=k; 76 u=pre[u]; 77 } 78 } 79 } 80 if(!k)break; 81 for(i=1;i<=n;i++)if(!id[i])id[i]=++k; 82 //eliminate circle 83 for(i=0;i<m;i++){ 84 e[i].w-=minw[e[i].v]; 85 e[i].u=id[e[i].u]; 86 e[i].v=id[e[i].v]; 87 } 88 n=k; 89 root=id[root]; 90 } 91 return ans; 92 } 93 94 int main() 95 { 96 // freopen("in.txt","r",stdin); 97 int i,j,a,b; 98 double c,ans; 99 while(scanf("%d%d",&n,&m)!=EOF) 100 { 101 for(i=1;i<=n;i++) 102 scanf("%lf%lf",&nod[i].x,&nod[i].y); 103 for(i=0;i<m;i++){ 104 scanf("%d%d",&a,&b); 105 c=dist(nod[a],nod[b]); 106 e[i].u=a,e[i].v=b,e[i].w=c; 107 } 108 109 ans=zhu_liu(1); 110 if(ans>=0)printf("%.2lf\n",ans); 111 else printf("poor snoopy\n"); 112 } 113 return 0; 114 }
转载于:https://www.cnblogs.com/zhsl/archive/2013/02/01/2888834.html
POJ-3164 Command Network 最小树形图相关推荐
- POJ 3164 Command Network (最小树形图)
Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 10136 Accepted: 2946 ...
- POj 3164 Command Network最小树形图 模板题 朱刘算法
Command Network After a long lasting war on words, a war on arms finally breaks out between littleke ...
- POJ 3164 Command Network (最小树形图)
[题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...
- [POJ 3164]Command Network(最小树形图,朱刘算法)
文章目录 title solution code title solution 读完翻译后,很明显就是个朱刘算法的板子题 最小树形图,就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 ...
- POJ 3164 Command Network(朱刘算法)
Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 21481 Accepted: 6117 ...
- POJ 3164 Command Network
Description After a long lasting war on words, a war on arms finally breaks out between littleken's ...
- poj 3164 Command Network
最小树形图,,不熟练啊,写错几个地方无限TLE #include<stdio.h> #include<string.h> #include<math.h> #def ...
- 【POJ3164】Command Network 最小树形图模板题 重修版
链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...
- poj 3164(最小树形图)
有固定根的最小树形图求法O(VE): 首先消除自环,显然自环不在最小树形图中.然后判定是否存在最小树形图,以根为起点DFS一遍即可. 之后进行以下步骤. 设cost为最小树形图总权值. 0.置cost ...
最新文章
- loj10095 间谍网络
- reduction_indices的用法
- Python股票分析系列——基础股票数据操作(二).p4
- 深度linux卡顿,Deepin很卡怎么办?Deepin卡顿解决方法盘点
- PHP-递归扫描目录和删除目录
- 如何在金山毒霸软件里安装腾讯视频
- python 取列表偶数和奇数位置的值
- python基本内容讲解_Python命名约定基本内容解析
- 钩子的应用: 程序运行监视
- html标签asp/,HTML标签及ASP函数速查表
- 【Excel学习笔记8】“定位”可以用来干嘛?
- 阿里云实人认证是什么?
- PHP处理微信昵称特殊符号过滤方法
- exchange批量创建用户邮箱
- PQ硬盘分区魔术师怎么用|PQ8.05硬盘分区教程图解
- 扇形涂色问题(Python)
- 三冲IPO,独角兽唱吧能成为“K歌第一股”吗?
- Python 气象数据分析
- Gradle打包报错:Failed to calculate the value of task ‘:unityLibrary:compileReleaseJavaWithJavac‘
- python商务图表_Excel 数据之美:科学图表与商业图表的绘制(全彩)
热门文章
- 老年人不是时代弃子,而是能暴富的金矿!
- iOS之苹果自带的json解析NSJSONSerialization(序列化)
- patch文件格式 patch文件的结构 使用和制作patch文件
- PHP和Java的区别和用处?答案在这里
- python sqlalchemy oracle 中文_请教关于 flask-sqlalchemy 查询 oracle 库时, query.all()查询中编码的问题...
- 介绍Brook+的kernel到IL的转化方法和优化技巧
- 2.4G-WiFi连接路由器过程
- 弘辽科技:开淘宝直通车有哪些简单技巧?注意事项是什么?
- MySQL8.0 MGR介绍
- 页面的table直接转excel并下载(不需要经过后台)