CJOI 2005 新年好
时间:2019-09-16
本文章向大家介绍CJOI 2005 新年好,主要包括CJOI 2005 新年好使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
简要分析:
- 本题要求经过一定的点的最短路
- 类似题目:孤岛营救问题
- 易得,从 i 点出发,经过 k 点 ,到达 j 点的最短路, 一定是从 i 到 k 的最短路加上从 k 到 j 的最短路
- 证明 :假设:从 i 点出发,经过 k 点 ,到达 j 点的最短路,不是从 i 到 k 的最短路加上从 k 到 j 的最短路
- 则应存在 路径 E1(i->k)+E2(k->j)<E1min+E2min 易证得假设不成立
- 枚举 从每个亲戚家出发到达其它车站所需时间
- 再枚举每种路径所需时间
- 时间复杂度(5*M log M+5^5) 可以接受
注意事项
- 本题是无向图,注意建图和建边
- 注意每次dijkstra都要重新预处理
具体代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> using namespace std; const int inf=2147483637,Max_N=50010,Max_M=100010; typedef pair<int,int>node; struct Edge { int dis,to,next; } E[Max_M*2];//注意是无向边 int Head[Max_N],Dis[6][Max_N],num_Edge,vis[Max_N]; inline int Read(void)//快读 { char ch=0; int w=0,x=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=x*10+(ch^48),ch=getchar(); return w?-x:x; } inline void Add_Edge(int from,int to,int dis)//建边 { E[++num_Edge].dis =dis; E[num_Edge].to =to; E[num_Edge].next =Head[from]; Head[from]=num_Edge; } int N,M,T[6],S,Ans=inf; inline void Dijkstra(int num)//求从T[num]点出发到达每点的最短路 { priority_queue <node,vector<node>,greater<node> >Q; for(int i=1; i<=N; ++i) Dis[num][i]=(i==S?0:inf),vis[i]=0; Q.push(make_pair(0,S)) ; while(!Q.empty() ) { int u=Q.top() .second; Q.pop() ; if(vis[u])continue; else vis[u]=1; for(int i=Head[u]; i; i=E[i].next ) { int v=E[i].to ; if(Dis[num][v]>Dis[num][u]+E[i].dis ) { Dis[num][v]=Dis[num][u]+E[i].dis ; if(!vis[v]) Q.push(make_pair(Dis[num][v],v)) ; } } } } int main(void) { N=Read(),M=Read(); for(int i=1; i<=5; ++i) T[i]=Read(); for(int i=1; i<=M; ++i) { int u=Read(),v=Read(),d=Read(); Add_Edge(u,v,d);//注意是无向边 Add_Edge(v,u,d); } T[0]=1; for(int i=0; i<=5; ++i) { S=T[i]; Dijkstra(i); } memset(vis,0,sizeof(vis)); for(int t1=1; t1<=5; ++t1)//枚举路径 { vis[t1]=1; for(int t2=1; t2<=5; ++t2) { if(!vis[t2]) { vis[t2]=1; for(int t3=1; t3<=5; ++t3) { if(!vis[t3]) { vis[t3]=1; for(int t4=1; t4<=5; ++t4) { if(!vis[t4]) { vis[t4]=1; for(int t5=1; t5<=5; ++t5) { if(!vis[t5]) { Ans=min(Ans,Dis[0][T[t1]]+Dis[t1][T[t2]]+Dis[t2][T[t3]]+Dis[t3][T[t4]]+Dis[t4][T[t5]]); } } vis[t4]=0; } } vis[t3]=0; } } vis[t2]=0; } } vis[t1]=0; } printf("%d\n",Ans); return 0; }
原文地址:https://www.cnblogs.com/Blacktears/p/11529151.html
- ORM查询语言(OQL)简介--概念篇
- Discuz! 任意文件删除漏洞重现及分析
- .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
- Java中Map相关的6大问题——每个开发人员都要注意
- android service 学习(下)
- 混淆漏洞CVE-2017-0213技术分析
- android service 学习(上)
- 黑帽SEO剖析之隐身篇
- Java中如何判断一个字符串是Java代码还是英文呢?
- 将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介
- Java中实现找到两个数组交集的2种方法,开发实用
- Java Web中JSP的include 指令知识点总结——每日一语法学习
- Java反序列化漏洞从理解到实践
- ORM查询语言(OQL)简介--高级篇(续):庐山真貌
- 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 数组属性和方法
- 【程序中的数学】利用德摩根定律简化布尔运算
- Conjob For hybris
- ListView通用泛型适配器
- Android实现C/S聊天室
- OpenCV4.4 CUDA编译与加速全解析
- 如何利用Kotlin实现极简回调
- Android辅助权限的介绍和配置完整记录
- Redis基础——剖析基础数据结构及其用法
- SwipeRefreshLayout+RecyclerView实现上拉刷新和下拉刷新功能
- 二值分析 | OpenCV + skimage如何提取中心线
- 详解OpenVINO 模型库中的人脸检测模型
- Tensorflow的妙用
- 终端抓包神器 | tcpdump参数解析及使用
- GoLang 中发送 email 邮件
- 漫画算法题:两数之和与三数之和