COJ 0500 杨老师的路径规划(MST)最小生成树

杨老师的路径规划(MST)
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B

试题描述

为满足同学们需求,杨老师在实验楼4层新建了好多个计算机教室供同学们使用。可是这样的话,由于路径很长,杨老师发现越来越难亲自走到每一个机房看看同学们有没有在玩游戏了。请你现在帮杨老师设计一个程序,给你每个教室间的路径长,设计出一条路线使每两个教室间都能联通且总长度最小,你只需要输出这个最小值即可。(裸MST)


输入

测试用例的第1行给出教室数目N ( < 100 );随后的N(N-1)/2行对应教室间的距离,每行给出三个正整数,分别是两个教室的编号,以及此两教室间的距离(int范围)。为简单起见,教室从1到N编号。

输出

输出最小的路径总长度。

输入示例

3
1 2 1
1 3 2
2 3 4

输出示例

3

其他说明

n<100

动态的最小生成树LCT:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 #define CH for(int d=0;d<=1;d++) if(ch[d])
10 using namespace std;
11 const int maxn=100+10,maxm=5000+10,inf=-1u>>1;
12 struct node{
13     node*fa,*ch[2],*mx;int x;bool rev;
14     node(){fa=ch[0]=ch[1]=NULL;mx=this;x=0;rev=false;}
15     void revt(){swap(ch[0],ch[1]);rev^=1;return;}
16     void update(){mx=this;CH{if(mx->x<ch[d]->mx->x)mx=ch[d]->mx;}return;}
17     void down(){if(rev){CH{ch[d]->revt();}rev=false;}return;}
18 }lct[maxn+maxm],*nodecnt;
19 int parent(node*x,node*&y){return (y=x->fa)?y->ch[0]==x?0:y->ch[1]==x?1:-1:-1;}
20 void rotate(node*x){
21     node*y,*z;int d1=parent(x,y),d2=parent(y,z);
22     if(y->ch[d1]=x->ch[d1^1]) y->ch[d1]->fa=y;
23     y->fa=x;x->fa=z;x->ch[d1^1]=y;
24     if(d2!=-1) z->ch[d2]=x;
25     y->update();return;
26 }
27 void pushdown(node*x){
28     static node*s[maxn];int top=0;
29     for(node*y;;x=y){
30         s[top++]=x;y=x->fa;
31         if(!y||(y->ch[0]!=x&&y->ch[1]!=x)) break;
32     } while(top--) s[top]->down();return;
33 }
34 node*splay(node*x){
35     pushdown(x);node*y,*z;int d1,d2;
36     while(true){
37         if((d1=parent(x,y))<0) break;
38         if((d2=parent(y,z))<0){rotate(x);break;}
39         if(d1==d2) rotate(y),rotate(x);
40         else rotate(x),rotate(x);
41     } x->update();return x;
42 }
43 node*access(node*x){
44     node*ret=NULL;
45     for(;x;x=x->fa) splay(x)->ch[1]=ret,(ret=x)->update();
46     return ret;
47 }
48 void makeroot(int x){access(x+lct)->revt();return;}
49 void link(int x,int y){makeroot(x);splay(x+lct)->fa=lct+y;return;}
50 void cut(int x,int y){
51     makeroot(x);node*p=(access(y+lct),splay(y+lct));
52     p->ch[0]=p->ch[0]->fa=NULL;p->update();return;
53 }
54 node*findtop(int x){
55     node*t=(access(x+lct),splay(x+lct));while(t->ch[0]) t->down(),t=t->ch[0];return t;
56 }
57 node*query(int x,int y){
58     makeroot(x);return access(y+lct)->mx;
59 }
60 int n,m;
61 inline int read(){
62     int x=0,sig=1;char ch=getchar();
63     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
64     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
65     return x*=sig;
66 }
67 inline void write(int x){
68     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
69     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
70     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
71 }
72 int s[maxm],t[maxm];
73 void init(){
74     n=read();m=n*(n-1)>>1;int ans=0;nodecnt=lct+n+1;
75     for(int i=1;i<=m;i++){
76         s[i]=read();t[i]=read();node*q=nodecnt++;q->x=read();int k=q-lct;makeroot(k);
77         if(findtop(s[i])!=findtop(t[i])){
78             link(s[i],k);link(t[i],k);ans+=q->x;
79         }else{
80             node*p=query(s[i],t[i]);if(p->x<q->x) continue;
81             ans+=q->x-p->x;int id=p-lct-n;
82             cut(s[id],p-lct);cut(t[id],p-lct);
83             link(s[i],k);link(t[i],k);
84         }
85     } write(ans);
86     return;
87 }
88 void work(){
89     return;
90 }
91 void print(){
92     return;
93 }
94 int main(){init();work();print();return 0;}

静态Kruskal:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=100+10,maxm=5000+10;
11 struct edge{int x,y,w;}e[maxm];
12 bool cmp(edge a,edge b){return a.w<b.w;}
13 inline int read(){
14     int x=0,sig=1;char ch=getchar();
15     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
16     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
17     return x*=sig;
18 }
19 inline void write(int x){
20     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
21     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
22     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
23 }
24 int n,m,fa[maxn];
25 int findset(int x){return (fa[x]==x)?x:fa[x]=findset(fa[x]);}
26 void init(){
27     n=read();m=n*(n-1)>>1;
28     for(int i=1;i<=n;i++) fa[i]=i;
29     int x,y;
30     for(int i=1;i<=m;i++){
31         x=read();y=read();
32         e[i]=(edge){x,y,read()};
33     }
34     sort(e+1,e+1+m,cmp);
35     int ans=0,cnt=0;
36     for(int i=1;i<=m;i++){
37         int x=findset(e[i].x),y=findset(e[i].y);
38         if(x!=y){
39             fa[y]=x;ans+=e[i].w;
40             if(++cnt==n-1) break;
41         }
42     } write(ans);
43     return;
44 }
45 void work(){
46     return;
47 }
48 void print(){
49     return;
50 }
51 int main(){init();work();print();return 0;}
时间: 2024-10-13 16:32:47

COJ 0500 杨老师的路径规划(MST)最小生成树的相关文章

COJ500 杨老师的路径规划(MST) (我是认真的)

用LCT来维护生成树,动态加边(s,t,w)时,新建节点x,权值为边权w. 1.若s与t不连通,则连接s-x,x-t,答案+w 2.若s与t连通,找出s-t路径上的最大权w2,若w<w2,删除w2的连边,连接s-x,x-t,答案+w-w2 太水了是不是! #include<cstdio> #include<cctype> #include<queue> #include<cstring> #include<algorithm> #defin

【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status][Discuss] Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站. 地图由点和双向边构成,每个点代表一个路口,也有可

Unity路径规划

Unity路径规划 背景 酷跑游戏中涉及到弯道.不规则道路. 找来一些酷跑游戏的案例来看,很多都是只有直线道路,也就不存在所谓的路径问题,设置一个方向即可,本文主要给出几种我自己用过.看过的Unity中可以用做路径规划的一些资料. 方案一 Unity自带解决方案Navigation,可以参考小赵的文章: unity自带寻路Navmesh入门教程(一) unity自带寻路Navmesh入门教程(二) unity自带寻路Navmesh入门教程(三) 这几篇文章还是不错的,配合官方文档,对其功能就能就

iOS百度地图路径规划和POI检索详细总结-b

路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj.png 如上图所示,在infoplist里加入这个字段,而且这里还可以设置提示的内容.不加的话,嘿嘿嘿,期待你的尝试.坑二:如下图 Pasted_Graphic_jpg.png 导入百度地图API运行之后报上图错误大约18到20个左右,解决方法添加libstdc++.6.0.9 的库.填完坑之后看一下我们今天要演示的效果吧. 路线规划图.g

路径规划

机器人路径规划研究综述 1.什么是路径规划 路径规划技术是机器人研究领域中的一个重要分支.所谓机器人的最优路径规划问题,就是依据某个或某些优化准则(如工作代价最小,行走路线最短,行走时间最短等),在其工作空间中找到一条从起始状态到目标状态的能避开障碍物的最优路径. 依据某种最优准则,在工作空间中寻找一条从起始状态到目标状态的避开障碍物的最优路径. 需要解决的问题: 1.始于初始点止于目标点. 2.避障. 3.尽可能优化的路径. 2.路径规划技术分类 a.静态结构化环境下的路径规划,比如说slam

基于分层路网的路径规划算法

http://www.docin.com/p-1308678703.html 路径规划一般包括如下几种情况: 最短路径规划 最短时间规划 最经济规划 通过赋予图中的边以不同的权值来满足用户不同的需求 最短路径由于普通道路限速问题,未必是最短时间到达目的地, 可能上高速更快一些 分层思想 对于一个点P,以自身为中心,不断的扩大半径进行搜索,查看当前是否包括一个升级到高层路网的节点 如果有,说明当设置P为起点,然后设置T为终点,而且当distance(pt)> R,说明应该进行路网的升层 选择一个查

ios百度地图-路径规划

百度地图的路径规划功能, 在使用百度路径的时候,出现了一些小问题,在此,分享一下自己的最简单的一个路径小demo 当然,前面的百度配置问题,我就不和大家讲了,因为这方面的资料太多了!现在,我来介绍一下这个小demo AppDelegate.m文件如下, #import "AppDelegate.h" import "rootViewController.h" @implementation AppDelegate (BOOL)application:(UIAppli

高德地图路径规划

高德地图导航sdk的路径规划获取行程信息主要用到AMapNaviManager这个类 然后调下面的方法 /*! @brief 带起点的驾车路径计算 @param startPoints 起点坐标.支持多个起点,起点列表的尾点为实际导航起点,其他坐标点为辅助信息,带有方向性,可有效避免算路到马路的另一侧. @param endPoints 终点坐标.支持多个终点,终点列表的尾点为实际导航终点,其他坐标点为辅助信息,带有方向性,可有效避免算路到马路的另一侧. @param wayPoints 途经点

PRM路径规划算法

路径规划作为机器人完成各种任务的基础,一直是研究的热点.研究人员提出了许多规划方法:如人工势场法.单元分解法.随机路标图(PRM)法.快速搜索树(RRT)法等.传统的人工势场.单元分解法需要对空间中的障碍物进行精确建模,当环境中的障碍物较为复杂时,将导致规划算法计算量较大.基于随机采样技术的PRM法可以有效解决高维空间和复杂约束中的路径规划问题. PRM是一种基于图搜索的方法,它将连续空间转换成离散空间,再利用A*等搜索算法在路线图上寻找路径,以提高搜索效率.这种方法能用相对少的随机采样点来找到