您的位置:首页 > 其它

hdu-2066 一个人的旅行

2017-06-15 10:29 363 查看
http://acm.hdu.edu.cn/showproblem.php?

pid=2066

/*主要思路就是把小草家看做源点0,然后和小草家相近的城市到源点距离为0,这样就妥妥的变成了单源的dijkstra。就基本上是模板了。。。。。。。

*/

#include<cstdio>
#define N 1005
#define INF 0xfffffff
int map

,dis
,vis
,n;
void dijkstra()
{
int i,j;
for(i=1;i<=n;i++)
{
dis[i]=map[0][i];//出发点到各个地点的距离
vis[i]=false;//标记还没走
}
for(i=1;i<=n;i++)
{
int t=INF;
int k;
for(j=1;j<=n;j++)
{
if(!vis[j]&&t>dis[j])
{
t=dis[j];
k=j;
}
}
vis[k]=true;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
printf("%d\n",dis
);
}

int main()
{
int t,s,d,i,j,k,a,b,c;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
map[i][j]=INF;
}
n=0;//统计有几个地方
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b]) map[a][b]=map[b][a]=c;//保存路径的最小值,路径可能是双向 的。而且可能还有反复
if(n<a) n=a;
if(n<b) n=b;
}
n++;//注意,地方数加1,即到了终点
for(i=0;i<s;i++)
{
scanf("%d",&a);
map[0][a]=map[a][0]=0;//出发点都相邻城市时间为0
}
for(i=0;i<d;i++)
{
scanf("%d",&a);
map[a]
=map
[a]=0;//终点到想去的地方路径长度为0
}
dijkstra();
}
return 0;
}


// Floyd
#include "stdio.h"
#include "string.h"
const int inf = 1000000;
int map[1115][1115];
int max_city;
bool mark1[1005],mark2[1005];
int Floyd()
{
int temp=inf;
for( int k=1;k<=max_city;k++ )
{
for( int i=1;i<=max_city;i++ )
{
if( map[i][k]!=inf )
for( int j=1;j<=max_city;j++ )
{
if( map[i][j] > map[i][k] + map[k][j] )
{
map[i][j] = map[i][k] + map[k][j];
}
if( mark1[i] && mark2[j] )
temp=temp<map[i][j]?temp:map[i][j];
}
}
}
return temp;
}
int main()
{
int t,s,d,a,b,c,i,j,temp;
while( scanf("%d%d%d",&t,&s,&d)==3 )
{
for( i=0;i<1005;i++ )
for( j=i+1;j<=1005;j++ )
map[i][j]= map[j][i] = inf;
max_city=0;
for( i=0;i<t;i++ )
{
scanf("%d%d%d",&a,&b,&c);
if( map[a][b]>c )
map[a][b]=map[b][a]=c;
max_city=(a>b ? a:b) > max_city ? (a>b?

a:b) : max_city;
}
memset(mark1,0,sizeof(mark1));
memset(mark2,0,sizeof(mark2));
for( i=0;i<s;i++ )
{
scanf("%d",&temp);
mark1[temp]=true;
}
for( i=0;i<d;i++ )
{
scanf("%d",&temp);
mark2[temp]=true;
}
printf("%d\n",Floyd());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: