码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3268

时间:2015-07-22 16:08:51      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:acm   c++   poj   算法   最短路   

题意:所有牛要去X那里参加聚会,每头牛都走的是最短路,求往返的最长时间~(给出的边是单向的)

思路:dijkstra算法~ 所有牛从X返回时,可看做是求以X为起点的最短路,所有牛去X时,可以将邻接矩阵转置一下~

两次结果求和,再取最大值即可~

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define inf 0x7ffffff
int n,m,x;
int edge[1005][1005],d[1005],v[1005];
void  dijkstra()
{
  memset(v,0,sizeof(v));
  for(int i=1;i<=n;i++)
  d[i]=(i==x?0:edge[x][i]);
  for(int i=1;i<=n;i++)
  {
    int minn=inf,p;
    for(int j=1;j<=n;j++)
	{
	  if(!v[j]&&d[j]<minn)
	  {
	    minn=d[j];
	    p=j;
	  }
	}
	v[p]=1;
	for(int j=1;j<=n;j++)
	if(!v[j])
	d[j]=min(d[j],d[p]+edge[p][j]);
  }
  int ans=-1;
  return ;
}
int main()
{
	while(scanf("%d%d%d",&n,&m,&x)!=EOF)
	{
	 int from,to,w;
	 for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 {
	   if(i==j) edge[i][j]=0;
	   else edge[i][j]=inf;
	 }

	 while(m--)
	 {
	  scanf("%d%d%d",&from,&to,&w);
	  edge[from][to]=w;
	 }
	 dijkstra();
	 int d1[1005];
	 for(int i=1;i<=n;i++)
	 d1[i]=d[i];
	 for(int i=1;i<=n;i++)
	  for(int j=i+1;j<=n;j++)
	 {
	   swap(edge[i][j],edge[j][i]);
	 }
	 dijkstra();
	 int ans=-1;
	 for(int i=1;i<=n;i++)
	{
	  d1[i]+=d[i];
	  if(ans<d1[i])
		ans=d1[i];
	}
	 printf("%d\n",ans);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3268

标签:acm   c++   poj   算法   最短路   

原文地址:http://blog.csdn.net/mowenwen_/article/details/47003969

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!