WOJ#3836 Sightseeing Trip
时间:2019-11-13
本文章向大家介绍WOJ#3836 Sightseeing Trip,主要包括WOJ#3836 Sightseeing Trip使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
描述
给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题。在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。若无解,输出 No solution.。图的节点数不超过 100 。
输入
第一行两个正整数 n,m 表示点数和边数。
接下来 m 行,每行三个正整数 x,y,z ,表示节点 x,y 之间有一条长度为 z 的边。
输出
输出一个最小环的方案:按环上顺序输出最小环上的点。若最小环不唯一,输出任意一个均可。若无解,输出 No solution.
样例输入
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
样例输出
1 3 5 2
标签
CEOI1999
题解
其实这道题可以用Floyd。
容易知道,树加上一条非树边可以形成环。利用这个性质,我们可以先求出一棵最小生成树,然后通过枚举每一条非树边求出加上它之后所形成的环的大小并尝试更新答案。输出方案时直接在最小生成树上暴力跳就行了。时间复杂度O(mlogn)。
代码:
#include<bits/stdc++.h> using namespace std; #define gc getchar template<typename T>void read(T&cn){ char c;int sig=1; while(!isdigit(c=gc())) if(c=='-') sig=-1;cn=c-48; while( isdigit(c=gc())) cn=cn*10+c-48;cn*=sig; } #define N 100010 #define INF 0x3f3f3f3f int n,m; namespace T{ int num,f[N]; struct node{ int u,v,w,nxt; }e[N<<1]; void add(int u,int v,int w){ e[++num]=(node){u,v,w,f[u]};f[u]=num; e[++num]=(node){v,u,w,f[v]};f[v]=num; } //build graph int dep[N],dis[N],faz[N],siz[N],son[N],top[N]; void dfs1(int u,int fa,int d){ dep[u]=d;faz[u]=fa;siz[u]=1; for(int i=f[u];i;i=e[i].nxt){ int v=e[i].v; if(v==fa) continue; dis[v]=dis[u]+e[i].w;dfs1(v,u,d+1);siz[u]+=siz[v]; if(siz[v]>siz[son[u]]) son[u]=v; } } void dfs2(int u,int st){ top[u]=st; if(!son[u]) return;dfs2(son[u],st); for(int i=f[u];i;i=e[i].nxt){ int v=e[i].v; if(v==faz[u]||v==son[u]) continue; dfs2(v,v); } } int LCA(int x,int y){ int xx=top[x],yy=top[y]; while(xx^yy){ if(dep[xx]<dep[yy]){swap(xx,yy);swap(x,y);} x=faz[xx];xx=top[x]; } return dep[x]<dep[y]?x:y; } //tree dissection } namespace G{ struct node{ int u,v,w; }e[N]; bool operator < (node a,node b){return a.w<b.w;} //graph int fa[N]; int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} int merge(int x,int y){ int xx=find(x),yy=find(y); if(xx==yy) return 0; fa[xx]=yy; return 1; } //Disjoint-Set int vis[N]; void kruskal(){ sort(e+1,e+m+1);int cnt=0; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int u=e[i].u,v=e[i].v; if(merge(u,v)){cnt++;vis[i]=1;T::add(u,v,e[i].w);} if(cnt==n-1) break; } } //mst int sum=INF,a,b,c; #define pb push_back vector<int>ans; void work(){ read(n);read(m); for(int i=1;i<=m;i++){read(e[i].u);read(e[i].v);read(e[i].w);} kruskal();T::dfs1(1,0,1);T::dfs2(1,1); for(int i=1;i<=m;i++){ if(vis[i]) continue; int u=e[i].u,v=e[i].v; if(T::dep[u]<T::dep[v]) swap(u,v); if(T::faz[u]==v||u==v) continue; int lca=T::LCA(u,v),tmp=T::dis[u]+T::dis[v]-(T::dis[lca]<<1)+e[i].w; if(sum>tmp){sum=tmp;a=u,b=v;c=lca;} } if(sum==INF){puts("No solution.");exit(0);} while(a^c){printf("%d ",a);a=T::faz[a];}printf("%d ",c); while(b^c){ans.pb(b);b=T::faz[b];} if(ans.size()) for(int i=ans.size()-1;~i;i--) printf("%d ",ans[i]); } } int main(){ G::work(); return 0; }
原文地址:https://www.cnblogs.com/doyo2019/p/11850029.html
- 同步服务器系统时间操作记录
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装Windows虚拟机)-(4)
- ExtJs学习笔记(11)_Absolute布局和Accordion布局
- ExtJs学习笔记(9)_Window的基本用法
- DateTime在ExtJs中无法正确序列化的问题
- ELK实时日志分析平台环境部署--完整记录
- 梳理Linux下OSI七层网络与TCP/IP五层网络架构
- 字符编码-使用c#研究
- iframe高度自适应的IE解决方案
- javascript读写本机文本文件
- 崔立鹏:腾讯云为知识竞技游戏提供解决方案
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
- 常用的AJAX弹出层代码
- Linux下检测IP地址冲突及解决方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Cypress执行测试并邮寄发送测试报告
- 重拾前端技能为你的职业前程保驾护航
- 检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python
- 规则引擎 - drools 使用讲解(简单版) - Java
- Python奇技淫巧 - 持续更新中....
- 150+行Python代码实现带界面的数独游戏
- Python实现十大经典排序算法
- 140行Python代码实现Flippy Bird
- 200行Python代码实现贪吃蛇
- 简单说维特比算法 - python实现
- Android绘图及Bitmap几个知识点整理
- Spark Pipeline官方文档
- Python-时间及日期-07-获取本周或上周几具体日期
- Spark Job-Stage-Task实例理解
- 想查看微信好友撤回的消息?Python帮你搞定