题目链接: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 最小树形图相关推荐

  1. POJ 3164 Command Network (最小树形图)

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 10136   Accepted: 2946 ...

  2. POj 3164 Command Network最小树形图 模板题 朱刘算法

    Command Network After a long lasting war on words, a war on arms finally breaks out between littleke ...

  3. POJ 3164 Command Network (最小树形图)

    [题目链接]http://poj.org/problem?id=3164 [解题思路]百度百科:最小树形图 ]里面有详细的解释,而Notonlysucess有精简的模板,下文有对其模板的一点解释,前提 ...

  4. [POJ 3164]Command Network(最小树形图,朱刘算法)

    文章目录 title solution code title solution 读完翻译后,很明显就是个朱刘算法的板子题 最小树形图,就是给出一个带权有向图 从中指定一个特殊的结点 root 求一棵以 ...

  5. POJ 3164 Command Network(朱刘算法)

    Command Network Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 21481   Accepted: 6117 ...

  6. POJ 3164 Command Network

    Description After a long lasting war on words, a war on arms finally breaks out between littleken's ...

  7. poj 3164 Command Network

    最小树形图,,不熟练啊,写错几个地方无限TLE #include<stdio.h> #include<string.h> #include<math.h> #def ...

  8. 【POJ3164】Command Network 最小树形图模板题 重修版

    链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...

  9. poj 3164(最小树形图)

    有固定根的最小树形图求法O(VE): 首先消除自环,显然自环不在最小树形图中.然后判定是否存在最小树形图,以根为起点DFS一遍即可. 之后进行以下步骤. 设cost为最小树形图总权值. 0.置cost ...

最新文章

  1. loj10095 间谍网络
  2. reduction_indices的用法
  3. Python股票分析系列——基础股票数据操作(二).p4
  4. 深度linux卡顿,Deepin很卡怎么办?Deepin卡顿解决方法盘点
  5. PHP-递归扫描目录和删除目录
  6. 如何在金山毒霸软件里安装腾讯视频
  7. python 取列表偶数和奇数位置的值
  8. python基本内容讲解_Python命名约定基本内容解析
  9. 钩子的应用: 程序运行监视
  10. html标签asp/,HTML标签及ASP函数速查表
  11. 【Excel学习笔记8】“定位”可以用来干嘛?
  12. 阿里云实人认证是什么?
  13. PHP处理微信昵称特殊符号过滤方法
  14. exchange批量创建用户邮箱
  15. PQ硬盘分区魔术师怎么用|PQ8.05硬盘分区教程图解
  16. 扇形涂色问题(Python)
  17. 三冲IPO,独角兽唱吧能成为“K歌第一股”吗?
  18. Python 气象数据分析
  19. Gradle打包报错:Failed to calculate the value of task ‘:unityLibrary:compileReleaseJavaWithJavac‘
  20. python商务图表_Excel 数据之美:科学图表与商业图表的绘制(全彩)

热门文章

  1. 老年人不是时代弃子,而是能暴富的金矿!
  2. iOS之苹果自带的json解析NSJSONSerialization(序列化)
  3. patch文件格式 patch文件的结构 使用和制作patch文件
  4. PHP和Java的区别和用处?答案在这里
  5. python sqlalchemy oracle 中文_请教关于 flask-sqlalchemy 查询 oracle 库时, query.all()查询中编码的问题...
  6. 介绍Brook+的kernel到IL的转化方法和优化技巧
  7. 2.4G-WiFi连接路由器过程
  8. 弘辽科技:开淘宝直通车有哪些简单技巧?注意事项是什么?
  9. MySQL8.0 MGR介绍
  10. 页面的table直接转excel并下载(不需要经过后台)