当前位置: 代码迷 >> 综合 >> codeforces-601A The Two Routes (Floyd)
  详细解决方案

codeforces-601A The Two Routes (Floyd)

热度:59   发布时间:2023-11-08 16:12:53.0

题意:
是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;
}
  相关解决方案