CF1204C
2024-10-06 19:44:58
CF1204C-Anna, Svyatoslav and Maps
题意:
题目传送门
不想说了,阅读题。
解法:
先用floyd跑出各顶点间的最短路。把p(1)加入答案,然后沿着题目给的路径序列遍历,如果答案中的最后一个顶点到当前遍历到的顶点的最短距离,小于原序列中两点的距离和,则答案加上p(i-1),并且继续遍历路径,遍历完之后在最后加上p(m)
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
#define LL long long
#define N 110
int e[N][N],ans[N*N*N];
int p[N*N*N],n,m,cnt;
void floyd() {
for(int k = 1 ; k <= n ; k++) {
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= n ; j++) {
e[i][j] = min(e[i][j],e[i][k] + e[k][j]);
}
}
}
}
int main(){
scanf("%d",&n);
getchar();
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= n ; j++) {
char t = getchar();
e[i][j] = (t == '1') ? 1 : INF;
if(i == j) e[i][j] = 0;
}
getchar();
}
scanf("%d",&m);
for(int i = 1 ; i <= m ; i++)
scanf("%d",&p[i]);
floyd();
ans[++cnt] = p[1];
int dis = 0;
for(int i = 2 ; i <= m ; i++) {
dis += e[p[i - 1]][p[i]];
if(dis > e[ans[cnt]][p[i]]){
ans[++cnt] = p[i - 1];
dis = e[ans[cnt]][p[i]];
}
}
ans[++cnt] = p[m];
printf("%d \n",cnt);
for(int i = 1 ; i <= cnt ; i++)
printf("%d ",ans[i]);
//system("pause");
return 0;
}
最新文章
- 流的文件操作(File)
- angularjs中父,子,兄之间controller值得传递
- SQL入门语句之运算符
- EF常用命令行
- Tomcat7.0安装配置
- android自动化之monkeyrunner
- 在Web中实现C/S模式的Tab
- win8 修改msconfig 里面的";引导高级选项"; 最大内存后 BSOD的解决方案
- HDU 5119 Happy Matt Friends
- Installing MySQL Connector/Python using pip v1.5
- Android:自定义适配器
- 在Android中访问内置SE和基于SE的卡模拟(一)
- Tomcat架构(四)
- (转)修改IIS默认的localhost名称
- python tcp socket 多线程
- 初识JavaScript(一)
- Dynamics CRM 在报表中获取当前登陆用户的guid
- Android中,粗暴的方式,修改字体
- JavaIO流——简单对文件的写入及读取(三)
- Visual Studio 2017 注册码
热门文章
- Sql Server 分区演练
- SqlServer2008 R2发布订阅
- IOC+EF+Core项目搭建IOC注入及框架(二)
- 检测对象类型的两种方式,constructor属性和instanceof
- arcgis js 之 渔网工具(调用地图服务)
- C++ STL 之 stack
- 利用axis调用webservice接口
- Java秒杀实战 (六) 服务级高并发秒杀优化(RabbitMQ+接口优化)
- Django:forms局部函数、cookie、sesion、auth模块
- linux——命令2—删除—查看—搜索