[ An Ac a Day ^_^ ] CodeForces 601A The Two Routes 最短路

14号就ccpc全国赛的全国赛了 而且也快东北赛的选拔赛了

现在队伍实力实在不行 参加了也是边缘化的队伍

虽然有新生保护的设置

但实话说 机会还是不大

所以不如趁现在开始好好努力 明年也许还有机会

An Ac a Day ( of course not keep a girl away ^_^ )

题意呢 一个人开火车 一个人开大巴 火车走铁路 大巴走公路

现在有n个城镇 每两个城镇之间都有路

其中m条铁路 其他的都是公路 要求两个人都从1开始走 途中不相遇 问最快要多久

题面比较诡异 两个人 还不允许相遇

不过题中已经说了每两个城镇之间都有路 所以1到n之间一定有一条公路或一条铁路

因此一定至少有一个人在t=1时就到了 这就不用考虑相遇的事了

接下来对另外一个人最短路就好了~

400的数据Floyd暴力都是可以的 不过闲着也是闲的 复习一下Dijkstra

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<math.h>
 5 #include<string.h>
 6 #include<string>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<queue>
11 #define M(a,b) memset(a,b,sizeof(a))
12 #define ll long long
13 using namespace std;
14 const int inf=0x3f3f3f;
15 bool vis[405];
16 bool way[405][405];
17 int lowcost[405];
18 int n,m;
19 void Dijkstra(){
20     for(int i=1;i<=n;i++)
21         lowcost[i]=inf;
22     lowcost[1]=0;
23     for(int i=1;i<=n;i++){
24         int k=-1;
25         int min_=inf;
26         for(int j=1;j<=n;j++){
27             if(!vis[j]&&lowcost[j]<min_){
28                 min_=lowcost[j];
29                 k=j;
30             }
31             if(k==-1) continue;
32             vis[k]=true;
33             for(int j=1;j<=n;j++){
34                 if(!vis[j]&&lowcost[k]+way[k][j]<lowcost[j]&&way[k][j])
35                     lowcost[j]=lowcost[k]+way[k][j];
36             }
37         }
38     }
39 }
40 int main(){
41     scanf("%d%d",&n,&m);
42     int a,b;
43     for(int i=0;i<m;i++){
44         scanf("%d%d",&a,&b);
45         way[a][b]=way[b][a]=true;
46     }
47     if(way[1][n])
48         for(int i=1;i<=n;i++)
49             for(int j=1;j<=n;j++)
50                 if(i!=j) way[i][j]=!way[i][j];
51     Dijkstra();
52     if(lowcost[n]>=inf) printf("-1
");
53     else printf("%d
",lowcost[n]);
54     return 0;
55 }
原文地址:https://www.cnblogs.com/general10/p/5762697.html