poj3164(最小树形图模版)
对最小树形图做个小小的总结:
1:清除自环,自环是不可能存在于任何最小树形图中的;
2:求出每个顶点的的最小入边;
3:判断该图是否存在最小树形图,由 1 可以判定,或者以图中顶点v作为根节点遍历该图就能判 断是否存在最小树形图;
4:找环,之后建立新图,缩点后重新标记。
题意:说部队之间通过电缆传达信息,但是传达方向是单向的,前n行中给出部队坐标位置,后m行给出可以连接的部队,问最少需要多长的电缆。
思路:采用最小树形图算法
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1005;
struct node{double x,y;
}num[maxn];
struct V{int u,v;double w;
}ver[maxn*maxn];
double Dist(node a,node b){double x=a.x-b.x;double y=a.y-b.y;return sqrt(x*x+y*y);
}
double in[maxn];//记录最小边权
int pre[maxn];//记录前驱节点
int vis[maxn];//标记圈的情况
int id[maxn];//记录圈的个数
int n,m;//输入
int pos;//记录根节点
double Drector_MST(int n,int m,int root){double ans=0;while(true){for(int i=0;i<n;i++){//初始化最小边权in[i]=inf;}for(int i=0;i<m;i++){int u=ver[i].u;int v=ver[i].v;if(u!=v&&ver[i].w<in[v]){//当最小边权可以更新时in[v]=ver[i].w;//记录最小边权pre[v]=u;//记录最小边权的前驱节点}if(root==u){pos=i;}}for(int i=0;i<n;i++){if(root!=i&&in[i]==inf){//判断是否可以构成最小树形图return -1;}}int cnt=0;//记录圈数memset(vis,-1,sizeof(vis));memset(id,-1,sizeof(id));in[root]=0;for(int i=0;i<n;i++){ans+=in[i];int v=i;while(root!=v&&vis[v]!=i&&id[v]==-1){//记录以i我缩点的圈vis[v]=i;v=pre[v];}if(root!=v&&id[v]==-1){for(int u=pre[v];u!=v;u=pre[u]){id[u]=cnt;}id[v]=cnt++;}}if(cnt==0)break;//当圈数为零的时候,表示得到最小树形图,breakfor(int i=0;i<n;i++){//表示将剩下的是以一个点作为圈if(id[i]==-1){id[i]=cnt++;}}for(int i=0;i<m;i++){int u=ver[i].u;int v=ver[i].v;ver[i].u=id[u];ver[i].v=id[v];if(id[u]!=id[v]){//表示不在同一个圈中ver[i].w-=in[v];}}n=cnt;root=id[root];}return ans;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){for(int i=0;i<n;i++){scanf("%lf %lf",&num[i].x,&num[i].y);}for(int i=0;i<m;i++){scanf("%d %d",&ver[i].u,&ver[i].v);ver[i].u--;ver[i].v--;if(ver[i].u!=ver[i].v){ver[i].w=Dist(num[ver[i].u],num[ver[i].v]);}else{ver[i].w=inf;}}double ans=Drector_MST(n,m,0);if(ans==-1){cout<<"poor snoopy"<<endl;}else{cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;}}return 0;
}
poj3164(最小树形图模版)相关推荐
- poj3164(最小树形图朱刘算法模板)
题目链接:http://poj.org/problem?id=3164 题意:第一行为n, m,接下来n行为n个点的二维坐标, 再接下来m行每行输入两个数u, v,表点u到点v是单向可达的,求这个有向 ...
- POJ3164 最小树形图 有向图的最小生成树 模板题 朱刘算法 朱永津-刘振宏算法
Command Network Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 12833 Accepted: 3717 ...
- HDU2121(最小树形图的模版算法题)
这个道题也是在看了大神之后敲的,我也是刚刚学习这个 ^ _ ^,看来离大佬们的距离还是太远了:以下内容也是在学习大佬讲解的内容之后,根据大佬们的详细讲解中总结出来的! 贪心算法.可以想到每次都找每个点 ...
- POJ-3164 Command Network 最小树形图
题目链接:http://poj.org/problem?id=3164 裸的最小树形图,用朱-刘算法解决,具体实现过程如下:算法一开始先判断从固定根开始是否可达所有原图中的点,若不可,则一定不存在最小 ...
- 【POJ3164】Command Network 最小树形图模板题 重修版
链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...
- TJU 2248. Channel Design 最小树形图
最小树形图,測模版.... 2248. Channel Design Time Limit: 1.0 Seconds Memory Limit: 65536K Total Runs: 2199 ...
- NOI数据结构:最小树形图
最小树形图-朱刘算法详解 +例题解析 最小树形图-朱刘算法详解 +例题解析_pursuit的博客-CSDN博客_最小树形图 图论 -- 生成树 -- 最小树形图 图论 -- 生成树 -- 最小树形图_ ...
- TJU 2248. Channel Design 最小树形图
最小树形图,測模版.... 2248. Channel Design Time Limit: 1.0 Seconds Memory Limit: 65536K Total Runs: 2199 ...
- 最小树形图-朱刘算法详解 +例题解析
文章目录 最小树形图 定义 和最小生成树的区别 朱刘算法 思想 步骤 流程展示 算法实现 例题 POJ3164_Command_Network HDU2121_Ice_cream's_world_II ...
最新文章
- ssh中exit命令退出远程服务器_解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止...
- html5 canvas 版 hello world! 暨haXe简介
- 计算机不能显示可移动磁盘咋办,U盘插上电脑不显示“可移动磁盘”该怎么办...
- 十、封装python3读写ini文件类
- 查询HTML标签select中options的值并定位其位置
- vuforia for unity 注意事项
- 全国30m土壤质地数据、土壤类型数据、土壤PH、有机质、土壤理化性质数据获取/土壤侵蚀数据/土地利用数据/NPP数据/径流量数据/太阳辐射数据/降雨量数据
- Linux 安装NDK
- js的爬山之路原型与原型链~~狂徒李四
- 超火爆的人类一败涂地Human Fall Flat Mac中文版(支持m1)
- 朋友圈集赞,简洁壁纸,玩游戏学git
- C++ 泛型编程(五) 模版重载与特例化
- 基于卷积神经网络的猫狗识别系统的设计与实现
- 【升级华为网络设备及失败修复】
- 参加2020全国大学生数学建模竞赛有感
- python是一种语言吗-python语言是非开源语言吗
- springboot集成netty实现代理服务器
- 我在美团Android研发岗工作的那5年,社招面试心得
- 2022-2028全球与中国荧光增白剂 OB-1市场现状及未来发展趋势
- EZDML3.31发布 支持从数据库获取测试数据