http://codeforces.com/problemset/problem/602/C
题目大意: 有n个城市 有m条铁路 如果两个城市没有铁路 那么一定有公路
求从1 到 n 用铁路和公路都到达的最短时间 如果有一种方式不能到 就直接输出-1
分析: 肯定有一种方法是直接从1到四的 然后直接两个地杰斯特拉 输出最大值就行...
#include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> #include<string.h> #include<stdlib.h> #define INF 0xfffffff #define memset(a,b) memset(a,b,sizeof(a)) using namespace std; #define N 500 int G[N][N],vis[N],dis[N],maps[N][N],dis1[N];; int n,m; void Inn() { for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { G[i][j]=INF; maps[i][j]=INF; } dis[i]=INF; dis1[i]=INF; vis[i]=0; } } int Dij1(int s,int e) { dis[s]=0; for(int i=1;i<=n;i++) { int Min=INF,dist; for(int j=1;j<=n;j++) { if(Min>dis[j] && vis[j]==0) { Min=dis[j]; dist=j; } } vis[dist]=1; for(int j=1;j<=n;j++) { dis[j]=min(dis[j],dis[dist]+G[dist][j]); } } return dis[e]; } int Dij2(int s,int e) { memset(vis,0); dis1[s]=0; for(int i=1;i<=n;i++) { int Min=INF,dist; for(int j=1;j<=n;j++) { if(Min>dis1[j] && vis[j]==0) { Min=dis1[j]; dist=j; } } vis[dist]=1; for(int j=1;j<=n;j++) { dis1[j]=min(dis1[j],dis1[dist]+maps[dist][j]); } } return dis1[e]; } int main() { while(scanf("%d %d",&n,&m)!=EOF) { Inn(); int u,v; for(int i=0;i<m;i++) { scanf("%d %d",&u,&v); G[u][v]=G[v][u]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) continue; if(G[i][j]==INF) maps[i][j]=1; } } int k1=Dij1(1,n); int k2=Dij2(1,n); if(k1==INF || k2==INF) printf("-1 "); else printf("%d ",max(k1,k2)); } return 0; }