http://codeforces.com/problemset/problem/601/A

这道题没想过来, 有点脑筋急转弯的感觉了

本质上就是找最短路径 但是卡在不能重复走同一个点 ---->>> 这是来坑人的

因为这是一个完全图(不是被road 连接  就是被rail连接 ) 所以一定有一条直接连1 和 n的路径

那么只用找没有连 1 和 n 的路径的 那个图的最短路即可

然后这个dijkstra写的是O(V^2)的写法

以后尽量用优先队列的写法O(ElogV)

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
using namespace std; int rail[][];
int road[][];
int n, m; int dijkstra(int town[][])
{
int dist[];
bool use[];
memset(use, , sizeof(use));
fill(dist, dist+n+, INF);
dist[] = ;
while (true)
{
int v = -;
for (int i = ; i <= n; i++)
{
if (!use[i] && (v == - || dist[i] < dist[v])) v = i;
}
if (v == -) break;
use[v] = true;
for (int i = ; i <= n; i++)
{
dist[i] = min(dist[i], dist[v] + town[v][i]);
}
}
return dist[n]; }
int main()
{
freopen("in.txt", "r", stdin);
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
rail[i][j] = INF;
road[i][j] = ;
}
}
for (int i = ; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
rail[x][y] = ;
rail[y][x] = ;
road[x][y] = INF;
road[y][x] = INF;
}
int ans = ;
if (rail[][n] == INF || rail[n][] == INF) ans = dijkstra(rail);
else ans = dijkstra(road);
if (ans == INF) printf("-1\n");
else printf("%d\n",ans);
}

最新文章

  1. windows对象模型分类
  2. webstorm抽取函数
  3. 史航第12次作业&amp;总结
  4. 如何使用BHO定制你的Internet Explorer浏览器
  5. asp.net Routing 用法
  6. Oracle命令:授权-收回权限-角色
  7. IIS问题汇总
  8. 队列(顺序存储)C++模板实现
  9. java特殊运算符(转)
  10. 在http编程的门口----飞牛网自动下单,查单
  11. 如何利用express新建项目(上)
  12. Machine Learning and Data Mining Lecture 1
  13. Android 自定义帧动画
  14. 第9天:CSS精灵图
  15. HDU3605 Escape
  16. Docker----在Docker中部署Asp.net core2.1以及修改发布
  17. Tell Me About Yourself - Best Answers and Examples
  18. pipenv使用总结
  19. ORACLE的rownum用法讲解
  20. Lunx下 怎样启动和关闭oracle数据库

热门文章

  1. 基于Java实现的冒泡排序算法
  2. java设计模式之单例设计模式
  3. f# mathprovider
  4. poj3436 Computer Factory
  5. 伟景行 citymaker 从入门到精通系列
  6. 程序员必须知道FTP命令
  7. 消息中间件与RPC的区别
  8. Android天天数钱游戏项目源码
  9. windows安装tensorflow的一个教训
  10. ADB相关指令实例详解