最短路径--dijkstra--Silver Cow Party

最短路径–dijkstra–Silver Cow Party

Description
每头奶牛一头N农场(1≤)N≤1000)方便编号1.N将参加在农场举行的大牛派对#X(1≤)X ≤ N)。总共M(1≤)M(≤100,000)单向(单程公路连接一对农场;公路i要求Ti(1≤)Ti≤100)穿越的时间单位。

每头母牛都必须走到派对上,等聚会结束后,再回到她的农场。每头牛都很懒,因此选择了一条最短时间的最佳路线。母牛的返回路线可能与她最初的派对路线不同,因为道路是单向的。

在所有的奶牛中,一头母牛要花多少时间才能走到派对上,然后再回来呢?

Input
第1行:三个空格分隔的整数:N, M,和X
第2行…。M+1:一行i+1描述道路i有三个空格分隔的整数:Ai, Bi,和Ti。描述的道路是从农场开出的。Ai务农Bi,要求Ti穿越的时间单位。

Output
第1行:一个整数:每头牛必须行走的最长时间。

Sample Input
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
Sample Output
10

dijkstra水题,只用注意路径重复的长度问题

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>

using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=1e3+5;
int m[MAX][MAX];
int d[MAX],a[MAX];
bool f[MAX];
int N,M,X;
void dijkstra()
{
	memset(f,true,sizeof(f));
	memset(d,inf,sizeof(d));
	d[X]=0;
	while(true)
	{
		int v=-1;
		for(int i=1;i<=N;i++)
		{
			if(f[i]&&(v==-1||d[v]>d[i]))
			v=i;
		}
		if(v==-1)
		return ;
		f[v]=false;
		for(int i=1;i<=N;i++)
		{
			d[i]=min(d[i],d[v]+m[v][i]);
		}
	}
}
int main()
{
	memset(m,inf,sizeof(m));
	cin>>N>>M>>X;
	while(M--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		m[a][b]=c;
	}
	dijkstra();
    for(int i=1;i<=N;i++)
	{
		a[i]=d[i];	
	}
    for(int i=1;i<=N;i++)
    {
    	for(int j=1;j<=i;j++)
        {
        	swap(m[i][j],m[j][i]);	
        }	
    }
    dijkstra();
    int ans=0;
    for(int i=1;i<=N;i++)
    {
    	ans=max(ans,d[i]+a[i]);
    }
    cout<<ans<<endl;
	return 0;
}
发布了19 篇原创文章 · 获赞 0 · 访问量 209

猜你喜欢

转载自blog.csdn.net/qq_45282116/article/details/104447340