您的位置:首页 > 其它

HDU 2066 一个人的旅行

2012-09-04 13:40 232 查看
求多起点多终点中最短的路径(时长),用floyd算法,最重要的是优化

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1002;
const int INF=1<<27;
int path

;
bool start
,end
;
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

,tmp
,link
,love
;;
bool s
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: