zoukankan      html  css  js  c++  java
  • hdu 2066 一个人的旅行

    点击打开链接

    Dij

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX 1007483647  //切记尽量不要超过2147483648/2
    int 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;
    }
    


  • 相关阅读:
    valgrind 内存调试工具
    centos7 firewall 相关
    linux timer operate
    string int 相互转换
    shared_ptr(作为局部变量返回)
    计算机网络--02物理层
    计算机网络学习笔记--01概述
    java基础---字符串string
    java基础--static关键字的使用
    java基础---java语言概述
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365389.html
Copyright © 2011-2022 走看看