您的位置:首页 > 其它

codeforce-601A. The Two Routes(最短路)

2015-11-30 11:33 323 查看
题意:

给你N个点表示N个站,有汽车和火车,汽车只能走公路,火车只能走铁路。

然后给你M条双向路,代表这两个点之间有铁路连接。

然后告诉你如果两个点之间没有铁路,那么就是公路连接。

问你汽车和火车都到达目的地所要的最小时间是多少(两种交通工具不能同时到达同一个城市除了目的地)。

如果有一种交通工具不能到达就输出-1;

思路:

如果两两点之间都是铁路,那么就没有公路,那么汽车不能到达,这时-1;

如果不是这种情况那么要么有铁路连接起点终点,要么有公路,所以两者间必有一个为1,

所以求另一个的最短路就行(肯定不会相撞)。(求两次最短路也行)。

复杂度N2;

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<cstdio>
#include<string.h>
void dj(int n);
const int V=99999999;
typedef struct pp
{
int x;
int y;
} ss;
using namespace std;
int flag[500];
int jj[500][500];
int  d[500];
int main(void)
{
int n,i,j,k,p,q,N,M;
while(scanf("%d %d",&N,&M)!=EOF)
{
memset(flag,0,sizeof(flag));
for(i=0; i<450; i++)
{
for(j=0; j<450; j++)
{
jj[i][j]=V;
}
}
for(i=0; i<M; i++)
{
scanf("%d %d",&p,&q);
jj[p][q]=1;
jj[q][p]=1;
}
dj(N);
int ss=d
;
for(i=0; i<450; i++)//求汽车的路径
{
for(j=0; j<450; j++)
{
if(jj[i][j]==V)
{
jj[i][j]=1;
}
else jj[i][j]=V;
}
}
dj(N);
int vv=d
;
int uu=max(vv,ss);
if(uu>=V)
{
printf("-1\n");
}
else printf("%d\n",uu);

}
return 0;
}

void dj(int n)//最短路N2算法
{
fill(d,d+n+1,V);
fill(flag,flag+n+1,0);
d[1]=0;
int i,j,k,p,q;
while(true)
{
int l=-1;
for(i=1; i<=n; i++)
{
if(flag[i]==0&&(l==-1||d[i]<d[l]))
{
l=i;
}
}
if(l==-1)
{
break;
}
flag[l]=1;
for(i=1; i<=n; i++)
{
d[i]=min(d[i],d[l]+jj[l][i]);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: