题意:
是n个城市之间任意两个城市间要么有火车线路要么有汽车线路,要从1出发到n,而且火车和汽车不能同时到达一个城市,问两者都到达的最短时间。
分析:
肯定有一种车可以从1直接到达n,并且这样肯定是最优的判断另一种能不能到达n就行了。
/*floyed算法求单源最短路径 i,j,k,其中k是中间结点,i是起点,k是终点 */
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define maxn 1010
using namespace std;
int n,m;
int x,y,z,ans,tmp;
int mp[maxn][maxn];
int floyed(int mp[maxn][maxn],int sta,int ed){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//更新点和起点或者终点都不可连 if(mp[i][k]==0||mp[k][j]==0) continue;//如果起点和终点不可连,那么一定更新 if(mp[i][j]==0) mp[i][j]=mp[i][k]+mp[k][j];mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); }}}return mp[1][n];
}int main(){//n个城市,m条双向铁路 sf("%d%d",&n,&m);for(int i=0;i<m;i++){sf("%d%d",&x,&y);mp[x][y]=1;mp[y][x]=1;}//起点和终点铁路相连 if(mp[1][n]==1){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){mp[i][j]=1-mp[i][j]; }}ans=floyed(mp,1,n);}//起点和终点公路相连 else{ans=floyed(mp,1,n);}if(ans==0) cout<<"-1"<<endl;else cout<<ans<<endl;return 0;
}