HDU 2066 一个人的旅行

求多起点多终点中最短的路径(时长),用floyd算法,最重要的是优化


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1002;
const int INF=1<<27;
int path[N][N];
bool start[N],end[N];
int manx,minn;
int floyd()
{
  int i,j,k;
  for(k=1;k<=manx;k++)
	  for(i=1;i<=manx;i++)
	  {
		  if(path[i][k]!=INF)//优化:减少不必要的循环
		  for(j=1;j<=manx;j++)
		  {
		     if(path[i][j]>path[i][k]+path[k][j])
				 path[i][j]=path[i][k]+path[k][j];
			 if(start[i]&&end[j]&&minn>path[i][j])
				 minn=path[i][j];
		  }
	 }
  return minn;
}
int main()
{
   int i,j,t,s,d,a,b,time,link,love;
   while(scanf("%d%d%d",&t,&s,&d)!=EOF)
   {
	   manx=0;minn=INF;
	   for(i=1;i<=1000;i++)
		   for(j=1;j<=1000;j++)
			   path[i][j]=INF;
      for(i=1;i<=t;i++)
	  {
	     scanf("%d%d%d",&a,&b,&time);
		 manx=manx<a?a:manx;//优化:取最大城市的编号
		 manx=manx<b?b:manx;//
		 path[a][b]=path[b][a]=path[a][b]>time?time:path[a][b];//两个城市可能有多条路径,取最少时长
	  }
	  memset(start,false,sizeof(start));
	  memset(end,false,sizeof(end));
	  for(i=1;i<=s;i++)
	  {
	     scanf("%d",&link);
		 start[link]=true;
	  }
	  for(i=1;i<=d;i++)
	  {
	     scanf("%d",&love);
		 end[love]=true;
	  }
      printf("%d\n",floyd());
   }
   return 0;
}


Dijkstra算法+枚举


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1002;
const int INF=1<<27;
int path[N][N],tmp[N],link[N],love[N];;
bool s[N];
void dijkstra(int first,int n)
{
	int i,j,u;
	memset(s,false,sizeof(s));
	for(i=1;i<=n;i++)
		tmp[i]=path[first][i];
	tmp[first]=0;s[first]=true;
	for(i=1;i<=n;i++)
	{
	   int temp=INF;
	   for(j=1;j<=n;j++)
	      if(!s[j]&&tmp[j]<temp)
			  temp=tmp[u=j];
		s[u]=true;
		for(j=1;j<=n;j++)
			if(!s[j]&&tmp[j]>tmp[u]+path[u][j])
				tmp[j]=tmp[u]+path[u][j];
	}
}
int main()
{
   int i,j,s,t,d,a,b,time;
   int manx,minn;
   while(scanf("%d%d%d",&s,&t,&d)!=EOF)
   {
      for(i=1;i<=1000;i++)
		  for(j=1;j<=1000;j++)
			  path[i][j]=INF;
		  minn=INF;manx=0;
		  for(i=1;i<=s;i++)
		  {
		     scanf("%d%d%d",&a,&b,&time);
			 manx=manx>a?manx:a;
			 manx=manx>b?manx:b;
			 if(time<path[a][b])
				 path[a][b]=path[b][a]=time;
		  }
		  for(i=1;i<=t;i++)
			  scanf("%d",&link[i]);
		  for(i=1;i<=d;i++)
			  scanf("%d",&love[i]);
		  for(i=1;i<=t;i++)
		  {
		      dijkstra(link[i],manx);
			  for(j=1;j<=d;j++)
                 if(minn>tmp[ love[j] ]) minn=tmp[ love[j] ];
		  }
	   printf("%d\n",minn);
   }
   return 0;
}


你可能感兴趣的:(优化,算法,Path)