51Nod1649 齐头并进(dijkstra)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84925317

因为每个小镇之间要么有一条铁路,要么有一条公路,所以火车和汽车不可能出现在同一个小镇上,所以求两次最短路径取最大的就行了。

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int INF=1e9+7;
int map[405][405];//map=1表示铁路,=0表示公路 
int n,m;
int d[405],vis[405];
void dijkstra()
{
	memset(vis,1,sizeof(vis));
	memset(d,0,sizeof(d));
	int i,j;
	for(i=1;i<=n;i++)
		d[i]=map[1][i];
	d[1]=0;
	vis[1]=0;
	for(i=1;i<n;i++)
	{
		int temp,minn=INF;
		for(j=1;j<=n;j++)
		{
			if(vis[j]&&d[j]<minn)
			{
				minn=d[j];
				temp=j;
			}
		}
		vis[temp]=0;
		for(j=1;j<=n;j++)
			if(vis[j]&&d[j]>d[temp]+map[temp][j])
				d[j]=d[temp]+map[temp][j];
	}
}
int main()
{
	cin>>n>>m;
	int i,j;
	for(i=0;i<=n;i++)
		for(j=0;j<=n;j++)
			map[i][j]=INF;
	if(m==0)
		cout<<"-1"<<endl;
	else
	{
		for(i=0;i<m;i++)
		{
			int s1,s2;
			cin>>s1>>s2;
			map[s1][s2]=map[s2][s1]=1;
		}
		dijkstra(); 
		int ans1=d[n];
		if(ans1==INF) cout<<"-1"<<endl;
		else
		{
			for(i=1;i<=n;i++)
				for(j=1;j<=n;j++)
					if(map[i][j]==INF)
						map[i][j]=1;
					else
						map[i][j]=INF;
			dijkstra();
			int ans2=d[n];
			if(ans2==INF) cout<<"-1"<<endl;
			else cout<<(max(ans1,ans2))<<endl;	
		}
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/84925317
今日推荐