题目

在一个叫奥斯汀的城市,有n个小镇(从1到n编号),这些小镇通过m条双向火车铁轨相连。当然某些小镇之间也有公路相连。为了保证每两个小镇之间的人可以方便的相互访问,市长就在那些没有铁轨直接相连的小镇之间建造了公路。在两个直接通过公路或者铁路相连的小镇之间移动,要花费一个小时的时间。

现在有一辆火车和一辆汽车同时从小镇1出发。他们都要前往小镇n,但是他们中途不能同时停在同一个小镇(但是可以同时停在小镇n)。火车只能走铁路,汽车只能走公路。

现在请来为火车和汽车分别设计一条线路;所有的公路或者铁路可以被多次使用。使得火车和汽车尽可能快的到达小镇n。即要求他们中最后到达小镇n的时间要最短。输出这个最短时间。(最后火车和汽车可以同时到达小镇n,也可以先后到达。)

输入

单组测试数据。
第一行有两个整数n 和 m (2≤n≤400, 0≤m≤n*(n-1)/2) ,表示小镇的数目和铁轨的数目。
接下来m行,每行有两个整数u 和 v,表示u和v之间有一条铁路。(1≤u,v≤n, u≠v)。
输入中保证两个小镇之间最多有一条铁路直接相连。

输出

输出一个整数,表示答案,如果没有合法的路线规划,输出-1。

输入样例

4 2
1 3
3 4

输出样例

2

思路:两遍 Dijkstra 求两次的最大值即可

源程序

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000+5;
const int dx[] = {-1,1,0,0};
const int dy[] = {0,0,-1,1};
using namespace std;int n,m;
struct Edge { //边int from;//下一条边的编号int to;//边到达的点int dis;//边的长度Edge(int f,int t,int d) { //构造函数from=f;to=t;dis=d;}
};struct HeapNode { //Dijkstra用到的优先队列的结点int dis;//点到起点距离int u;//点的序号HeapNode(int a,int b) {dis=a;u=b;}bool operator < (const HeapNode &rhs) const  {return dis > rhs.dis;}
};struct Dijkstra {int n,m;//点数、边数,均从0开始vector<Edge> edges;//边列表vector<int> G[N];//每个结点出发的边的编号bool vis[N];//是否走过int dis[N];//起点s到各点的距离int p[N];//从起点s到i的最短路中的最后一条边的编号void init(int n) {//初始化this->n = n;for(int i=0; i<n; i++) //清空邻接表G[i].clear();edges.clear();//清空边列表}void AddEdge(int from,int to,int diss) {//添加边,若为无向图,调用两次edges.push_back(Edge(from,to,diss));m=edges.size();//边的个数G[from].push_back(m-1);//添加至边列表}int dijkstra(int s) {//求s到所有点的距离memset(dis,INF,sizeof(dis));memset(vis,false,sizeof(vis));dis[s]=0;priority_queue<HeapNode> Q;//优先队列Q.push(HeapNode(0,s));while(!Q.empty()) {HeapNode x=Q.top();Q.pop();int u=x.u;if(vis[u])//若已被访问continue;vis[u]=true;//标记为已访问for(int i=0; i<G[u].size(); i++) { //枚举所有与当前点相连的边Edge &e=edges[G[u][i]];if(dis[e.to] > dis[u]+e.dis) {//更新距离dis[e.to] = dis[u]+e.dis;p[e.to]=G[u][i];Q.push(HeapNode(dis[e.to],e.to));}}}return dis[n];}
} DJ;
int mp[N][N];
int main() {scanf("%d%d",&n,&m);DJ.init(n);//初始化for(int i=0; i<m; i++) {int x,y;scanf("%d%d",&x,&y);mp[x][y]=1;mp[y][x]=1;//无向图添边两次DJ.AddEdge(x,y,1);DJ.AddEdge(y,x,1);}int res=DJ.dijkstra(1);if(res==INF||m==(n*(n-1))/2)printf("-1\n");else{DJ.init(n);for(int i=1;i<=n;++i){mp[i][i]=1;for(int j=1;j<=n;++j){if(!mp[i][j]){DJ.AddEdge(i,j,1);DJ.AddEdge(j,i,1);}}}if(DJ.dijkstra(1)==INF)printf("-1\n");else{res=max(res,DJ.dijkstra(1));printf("%d\n",res);}}return 0;
}

齐头并进(51Nod-1649)相关推荐

  1. 51nod 1649 齐头并进 (djikstra求最短路径,只用跑一次)

    题目: 这道题有一个坑点:两种交通工具同时出发,中途不能停留在同一个小镇. 其实想通了就很简单,因为要么火车一步到达,要么汽车一步到达.不可能停留在同一个地方. 可是我还WA了好几次,蠢哭.想用BFS ...

  2. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧--然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...

  3. 51NOD 1773:A国的贸易——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...

  4. 51nod 1040:最大公约数之和(数论)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. ...

  5. FZU 1649 Prime number or not (Miller-Rabin素数测试)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数.   当n达到long ...

  6. (DP)51NOD 1183 编辑距离

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  7. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)

    二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4, ...

  8. 51Nod 1003 阶乘后面0的数量(数学,思维题)

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...

  9. 51nod 1270 数组的最大代价

    1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 数组A包含N个元素A1, A2......AN.数组B包 ...

  10. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    51nod 算法马拉松18 B 非010串 矩阵快速幂 非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串 ...

最新文章

  1. RocketMQ类关系图之NameServer
  2. 【Python】青少年蓝桥杯_每日一题_8.19_数字组合
  3. python接口测试类型_python 接口测试字符类型转换
  4. 进击的UI---------------------UIStepper(加减)
  5. 为什么Go没有三元运算符
  6. js学习小计6-慎用return false;
  7. dns代表计算机哪个术语,windows dns 术语解释
  8. axure如何导出原件_彻底抛弃WORD!教你用Axure快速输出高质量的PRD
  9. 在eclipse中一种简单使用debug的方式
  10. python opencv双目测距_使用OpenCV/python进行双目测距
  11. COS_头发渲染shader
  12. 民营股份制企业是什么意思
  13. 集成学习方法之Bagging,Boosting,Stacking
  14. python结合mitmproxy抓包实践
  15. ANDROID 实现微信通讯录界面
  16. post请求https安全证书问题2.0
  17. android非线性渐变色,不同区域显示不同的渐变效果
  18. C语言-报数出圈问题(链表实现)
  19. 对啊英语音标---二、ghywr这些辅音怎么发音
  20. 请用函数实现一个判断用户输入的年份是否是闰年的程序

热门文章

  1. PHP 正在干掉 Python
  2. 世界十大最有价值公司(1997-2019)
  3. 当年发明hello, world的大神,后来怎么样了?
  4. 人工智能的前生,今世,和未来
  5. 电竞+区块链,玩家的4大入局方式
  6. 霍金去世,巨星陨落!谨以此文缅怀霍金
  7. python 暂停程序 等待用户输入_遇上Python程序暂停时,不要慌,教你正确的处理方法...
  8. 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜
  9. 没了IDE,你的Java项目还能Run起来吗~
  10. 2019沙雕失误瞬间!哈哈哈哈笑出猪叫...