HDU 2066 一个人的旅行

来源:互联网 发布:海关数据免费查询 编辑:程序博客网 时间:2024/05/01 10:04

Dijkstra算法的题目,看到题目知道是用Dijkstra算法,但是有些细节还是不会,只知道这个算法的框架,还不会灵活运用

代码:

#include<iostream>#include<cstdio>#define MAX 10000000#define M 1005using namespace std;int map[M][M];int a[M],b[M];int dist[M];bool flag[M];int T,S,D;int dj(int s){    int i,j;    int min;    for(i=0;i<M;i++)    {        flag[i]=0;        dist[i]=map[s][i];    }    int v=s;    dist[v]=0;    flag[v]=1;    for(j=0;j<M;j++){        min=MAX;        for(i=0;i<M;i++)        {            if(min>dist[i]&&!flag[i])            {                min=dist[i];                v=i;            }        }        flag[v]=1;        if(min==MAX) break;                           //剪枝        for(i=0;i<M;i++)                                 //更新dist的值        {            if(!flag[i]&&dist[i]>dist[v]+map[v][i])            {                dist[i]=dist[v]+map[v][i];            }        }    }    min=MAX;    for(i=0;i<D;i++){                          //求到达最喜欢的地方的最小值        if(min>dist[b[i]]) min=dist[b[i]];    }    return min;}int main(){  //  freopen("in.txt","r",stdin);    int i,j,w,e,time;    while(scanf("%d%d%d",&T,&S,&D)!=EOF)    {        for(i=0;i<M;i++)        {            for(j=0;j<M;j++)                map[i][j]=MAX;        }        for(i=0;i<T;i++)        {            scanf("%d%d%d",&w,&e,&time);            if(map[w][e]>time)                    //一定要加上这一条件,不然就WA,                map[w][e]=map[e][w]=time;        }        for(i=0;i<S;i++)        {            scanf("%d",&a[i]);        }        for(i=0;i<D;i++)        {            scanf("%d",&b[i]);        }        int min1=MAX;        for(i=0;i<S;i++)        {            min1=min1<dj(a[i])? min1:dj(a[i]);        }        printf("%d\n",min1);    }    return 0;}


原创粉丝点击