• 杭电 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
  • 相关阅读:
    xpath爬顶点页面信息
    urllib与urllib的区别
    爬虫代理IP
    前端js框架汇总
    scrapy的基本安装步骤
    Python+requests 爬取网站遇到中文乱码怎么办?
    爬虫笔记课后习题1
    至此记录点滴、、
    c++封装的发邮件类CSendMail
    Socket创建失败:10093错误
  • 原文地址:https://www.cnblogs.com/yizhanhaha/p/3226931.html
Copyright © 2020-2023  润新知