杭电 2066 一个人的旅行

题目地址: 

    http://acm.hdu.edu.cn/showproblem.php?pid=2066

  此题原来提交了一份floyd_warshall算法的代码,然后结果是超时,所以写了一个dijkstra算法的,AC!

  

#include <stdio.h>
//样例可能的最大的边数
#define MAXN 2000
//初始化用到的最大值
#define INF 100000
//存储城市与城市之间耗费时间的最小权值
int mat[MAXN][MAXN];
int min[MAXN];
void dijkstra(int n, int s)
{
    int v[MAXN], i, j, k;
    for( i = 1; i <= n; i++ )
        v[i] = 0, min[i] = INF;
    for( min[s] = 0, j = 0; j <= n; j++ )
    {
        for( k = 0, i = 1; i <= n; i++ )
            if( (!v[i]) &&((k == 0)||(min[i] < min[k])) )
                k = i;
        for( v[k] = 1, i = 1; i <= n; i++ )
            if( (!v[i]) && (min[k] + mat[k][i] < min[i]) )
                min[i] = min[k] + mat[k][i];
    }
}

int main()
{
    //t表示所有的边数;
    //s表示可能的所有的起点数;
    //d表示可能的所有的终点数。
    int t, s, d, i, j, k, temp;
    int max, min0;
    int ss[MAXN],dd[MAXN];
    //printf("123
");
    while( scanf( "%d%d%d", &t, &s, &d) != EOF )
    {
        //初始化
        max = 0;
        //printf("123
");
        for( i = 1; i < MAXN; i++ )
            for( j = 1; j < MAXN; j++ )
                mat[i][j] = INF;
        //printf("123
");
        //读取数据
        for( k = 0; k < t; k++ )
        {
            scanf( "%d%d%d", &i, &j, &temp );
            //解决重边问题
            if( temp < mat[i][j] )
                mat[i][j] = mat[j][i] = temp;
            //printf("123
");
            //找出可访问到的最大顶点数
            i = (i > j) ? i : j;
            max = (max > i) ? max : i;
        }
        /*printf("123
");
        printf( "%d
",max);
        printf( "%d %d
", s, d );*/
        for( i = 0; i < s; i++ )
        {
            scanf( "%d", &ss[i] );
            max = (max > ss[i]) ? max : ss[i];
        }
        for( i = 0; i < d; i++ )
        {
            scanf( "%d",&dd[i] );
            max = (max > dd[i]) ? max : dd[i];
        }

        /*for( i = 1; i <= max; i++ )
        {
            for( j = 1; j <= max; j++ )
                printf( "%d ", mat[i][j] );
            printf( "
" );
        }*/

        //处理
        min0 = INF;
        for(i = 0; i < s; i++)
        {
            dijkstra(max,ss[i]);
            for( j = 0; j < d; j++ )
                if( min0 > min[dd[j]] )
                    min0 = min[dd[j]];
        }
            printf( "%d
", min0 );
        
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/yizhanhaha/p/3226931.html