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;
}

最新文章

  1. 流的文件操作(File)
  2. angularjs中父,子,兄之间controller值得传递
  3. SQL入门语句之运算符
  4. EF常用命令行
  5. Tomcat7.0安装配置
  6. android自动化之monkeyrunner
  7. 在Web中实现C/S模式的Tab
  8. win8 修改msconfig 里面的&quot;引导高级选项&quot; 最大内存后 BSOD的解决方案
  9. HDU 5119 Happy Matt Friends
  10. Installing MySQL Connector/Python using pip v1.5
  11. Android:自定义适配器
  12. 在Android中访问内置SE和基于SE的卡模拟(一)
  13. Tomcat架构(四)
  14. (转)修改IIS默认的localhost名称
  15. python tcp socket 多线程
  16. 初识JavaScript(一)
  17. Dynamics CRM 在报表中获取当前登陆用户的guid
  18. Android中,粗暴的方式,修改字体
  19. JavaIO流——简单对文件的写入及读取(三)
  20. Visual Studio 2017 注册码

热门文章

  1. Sql Server 分区演练
  2. SqlServer2008 R2发布订阅
  3. IOC+EF+Core项目搭建IOC注入及框架(二)
  4. 检测对象类型的两种方式,constructor属性和instanceof
  5. arcgis js 之 渔网工具(调用地图服务)
  6. C++ STL 之 stack
  7. 利用axis调用webservice接口
  8. Java秒杀实战 (六) 服务级高并发秒杀优化(RabbitMQ+接口优化)
  9. Django:forms局部函数、cookie、sesion、auth模块
  10. linux——命令2—删除—查看—搜索