hdoj2066

Problem : 2066 ( 一个人的旅行 )     Judge Status : Accepted
RunId : 2839037    Language : G++    Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Wed 18 Aug 2010 05:49:24 PM CST
*File Name: main.cpp
*Description:单源最短路径。增加一个总出发点和一个总目的地转化为
*一般的单源最短路径
\***************************************************************/

//*========================*Head File*========================*\\

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int
T,S,D,N,a,b,_time,G[
1010][1010],Dest[1010],dist[1010];
bool
visit[
1010];
//*=======================*Main Program*=======================*//
using namespace std;

int
main(){

//freopen("input","r",stdin);
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
memset(G,
100,sizeof(G));//初始化为一个较大值
N=0;//N标记最大的顶点值
for(int i=0;i<T;i++){
scanf(
"%d%d%d",&a,&b,&_time);
if
(a>N)N=a;
if
(b>N)N=b;
if
(G[a][b]>_time)
//取最短路径
G[a][b]=G[b][a]=_time;
}

for
(int i=
1;i<=S;i++){//将0作为总出发点,它到各个实际出发点的距离为0
scanf("%d",&a);
if
(a>N)N=a;
G[
0][a]=G[a][0]=0;
}

for
(int i=
1;i<=D;i++){//N+1作为总目的地,这时还未确定下来
scanf("%d",Dest+i);
if
(Dest[i]>N)
N=Dest[i];
}

N++;
for
(int i=
1;i<=D;i++)//各目的地到总目的地的距离是0
G[N][Dest[i]]=G[Dest[i]][N]=0;

for
(int i=
1;i<=N;i++){
dist[i]=G[
0][i];
}

memset(visit,
false,sizeof(visit));
visit[
0]=1;
while
(
true){
int
u,_min=
1000000000;
for
(int i=
1;i<=N;i++){
if
(!visit[i]&&dist[i]<_min){
u=i;
_min=dist[i];
}
}

visit[u]=
true;
if
(u==N)break;
for
(int i=
1;i<=N;i++){
if
(!visit[i]&&dist[i]>_min+G[u][i])
dist[i]=_min+G[u][i];
}
}

printf(
"%d\n",dist[N]);
}
}
posted @ 2010-08-18 18:29  open source  阅读(176)  评论(0编辑  收藏