hdu 2066 一个人的旅行

来源:互联网 发布:java 动态生成数组 编辑:程序博客网 时间:2024/04/30 04:03

点击打开链接

Dij

#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX 1007483647  //切记尽量不要超过2147483648/2int map[1200][1200];    //模拟构造个无向图int s[1200];            //存放与草儿家连接的地方int d[1200];            //存放草儿想到的地方int T,S,D,max;           ///注意max的作用,记录出现地方的最大值(即,地方的代码1,2,3……)int count[1200];        //存放从某起点到任意终点的时间int flag[1200];         //作变量使用,仅此而已 int dijkstra(int x){         int i,j,k,d_min,d_ans;          //d_min 即在此循环中的最小量,作变量使用,d_ans为临时最最小答案         memset(count,0,sizeof(count));  //初始化很重要         memset(flag,0,sizeof(flag));    //         for(i=1;i<=max;i++)         {                   count[i] = map[x][i];                   flag[i]=0;         }         count[x]=0;         flag[x]=1;         for(i=1;i<=max;i++){                   d_min=MAX;                   for(j=1;j<=max;j++){                            if(flag[j]==0&&count[j]<d_min){                                     d_min = count[j];                                     k=j;                            }                   }                   flag[k]=1;                   for(j=1;j<=max;j++){                            if(flag[j]==0&&count[j]>count[k]+map[k][j])                                     count[j] = count[k]+map[k][j];                   }         }         d_min=MAX;         for(i=1;i<=D;i++){      ////                   if(count[d[i]]<d_min)                            d_min=count[d[i]];         }         return d_min;} int main(){         int i,j,a,b,time,m_min,m_ans;    ////         while(scanf("%d%d%d",&T,&S,&D)!=EOF)         {                   m_ans=MAX;                   max=0;                   for(i=0;i<1200;i++)                            for(j=0;j<1200;j++)                                     map[i][j]=MAX;                   for(i=0;i<T;i++)                   {                            scanf("%d%d%d",&a,&b,&time);                            if(map[a][b]>time)                                     map[a][b]=time;                            if(map[b][a]>time)                                     map[b][a]=time;                            if(a>max)max = a;                            if(b>max)max = b;                   }                   for(i=1;i<=S;i++)                            scanf("%d",&s[i]);                   for(i=1;i<=D;i++)                            scanf("%d",&d[i]);                   for(i=1;i<=S;i++)           ///依次从与草儿家相连的地方计算                   {                            m_min=dijkstra(s[i]);                            if(m_min<m_ans)                                     m_ans=m_min;                   }                   printf("%d\n",m_ans);         }         return 0;}


原创粉丝点击