HDU 2066一个人的旅行 (djkstra的简单运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066

题目大意:草儿家没有火车,只能通过相邻城市去往她想去的城市,且她想去的城市有很多,这就意味着起始点可以有多个,且终点也能有多个,你要从中选取一组最短的点。由于这道题并没有明确给定你所有城市的个数和编号,所以一个比较正确的选择是从1到1000全部遍历一遍。另外需要注意的一点就是一个城市到另外一个城市的路径可能不只有一条,所以你需要进行一个特判,选取最短的那一条。

好了,接下来上代码吧。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005,inf=0x3f3f3f;
int e[maxn][maxn],book[maxn],ans[100005];;
void djk(int p){
    int i,j,k;
    for(i=0;i<maxn-1;i++){
        int u,mi=inf;
        for(j=1;j<=maxn;j++){
            if(e[p][j]<mi&&!book[j]){
                mi=e[p][j];
                u=j;
            }
        }
        book[u]=1;//标记,表示该点从起始点到该点的距离已确定为最短;
        for(k=1;k<maxn;k++){
            if(e[u][k]!=inf)//若不能通过中转点到达K点就跳过;
            if(e[p][k]>e[p][u]+e[u][k]){
                e[p][k]=e[p][u]+e[u][k];
            }
        }
    }
}
int main(){
    int t,s,d,i,j,k,Lp[maxn],Wp[maxn];//Lp表示相邻的城市,Wp表示想要去的城市;
    while(cin>>t>>s>>d){
        memset(e,inf,sizeof(e));
        memset(ans,inf,sizeof(ans));
        for(i=0;i<t;i++){
            int x,y,z;
            cin>>x>>y>>z;
            if(e[x][y]>z){//由于到达一个城市的路径可能不唯一,故取最小的那条路径;
                e[x][y]=z;
                e[y][x]=z;
            }
        }
        for(i=0;i<s;i++)
        {
        memset(book,0,sizeof(book));
        cin>>Lp[i];
        book[Lp[i]]=1;
        djk(Lp[i]);
        book[Lp[i]]=0;//此处是必要的,因为下一个起始点到所有点的最短路径可能会以该点作为中转点。
        }
        for(i=0;i<d;i++)
        cin>>Wp[i];
        k=0;
        for(i=0;i<s;i++){
            for(j=0;j<d;j++){
                ans[k++]=e[Lp[i]][Wp[j]];//将从Lp[i]号城市到Wp[j]号城市的最短距离保存在一个数组里;
            }
        }
        sort(ans,ans+k);//进行排序,选择路径最短的一组作为答案输出;
        cout<<ans[0]<<endl;}
        
}

 

 

 

posted @ 2018-05-29 18:43  Zookkk  阅读(111)  评论(0编辑  收藏  举报