zoukankan      html  css  js  c++  java
  • 杭电 3790 最短路径问题

    题目地址:

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

        没什么太大的感觉,只是觉得进步是一个过于缓慢的感觉……

      dijkstra算法的应用,注意可重边的处理以及同等权值的路径时,路径的选择

    #include <stdio.h>
    #define MAXN 1010
    #define INF 1000000000
    
    int mat[MAXN][MAXN];
    int bb[MAXN][MAXN];
    int min[MAXN];
    int pre[MAXN];
    
    int com(int m, int s, int a, int b)
    {
        int path1[MAXN], path2[MAXN], i = 2, j = 2;
        int sum1 = 0, sum2 =0, p;
        path1[0] = path2[0] = m;
        path1[1] = a;
        path2[1] = b;
    
        while( a != s )
        {
            path1[i++] = pre[a];
            a = pre[a];
        }
        while( b != s )
        {
            path2[j++] = pre[b];
            b = pre[b];
        }
        for( p = 0; p < (i-1); p++ )
            sum1 += bb[path1[p]][path1[p+1]];
        for( p = 0; p < (j-1); p++ )
            sum2 += bb[path2[p]][path2[p+1]];
        if( sum1 >= sum2 )
            return path2[1];
        return path1[1];
    }
    void Dijkstra(int n,int s)
    {
        int v[MAXN], i, j, k;
        for( i = 1; i <=  n; i++  )
            v[i] = 0, min[i] = INF, pre[i] = -1;
        for( min[s] = 0, j = 1; 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]) && (mat[k][i] != INF) && (mat[k][i] + min[k] < min[i]) )
                {
                    min[i] = min[k] + mat[k][i];
                    pre[i] = k;
                }
                else if(  !v[i] && (mat[k][i] != INF) && (mat[k][i] + min[k] == min[i]) )
                    pre[i] = com(i,s,pre[i],k);
        }
    }
    
    int main()
    {
        int n, m, k, s, t, sum, end;
        int i, j, a, b;
        while( (scanf( "%d%d", &n, &m)!= EOF) && n && m )
        {
            for( i = 1; i <= n; i++ )
                for( j = 1; j <= n; j++ )
                {
                    mat[i][j] = INF;
                    bb[i][j] = INF;
                }
            for( k = 0; k < m; k++ )
            {
                scanf("%d%d%d%d", &i, &j, &a, &b);
                if( a < mat[i][j] )
                {
                    mat[j][i] = mat[i][j] = a;
                    bb[j][i] = bb[i][j] = b;
                }
                else if( (a == mat[i][j])&&(b < bb[i][j]) )
                    bb[i][j] = bb[j][i] = b;
            }
            /*for( i = 1; i <= n; i++ )
            {
                for( j = 1; j <= n; j++ )
                    printf( "%d ", mat[i][j] );
                printf( "
    " );
            }*/
            scanf("%d%d", &s, &t);
            //printf("%d %d
    ",s,t);
            Dijkstra(n,s);
            /*for( i = 1; i <= n; i++ )
                printf( "%d ", min[i] );
            printf( "
    " );
            for( i = 1; i <= n; i++ )
                printf( "%d ", pre[i] );
            printf( "
    " );*/
            //printf("123");
            sum = 0;
            end = t;
            while( end != s )
            {
                sum += bb[end][pre[end]];
                end = pre[end];
            }
            //printf("123");
            printf("%d %d
    ",min[t],sum);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    python 回调函数,最简单的例子
    python 构造一个可以返回多个值的函数
    python 使用函数参数注解
    Python 两个星号(**)的 参数
    python 什么是位置参数?
    sqlalchemy 的 ORM 与 Core 混合方式使用示例
    sqlalchemy 的 Core 方式使用示例
    sqlalchemy 的 ORM 方式使用示例
    sys.stdin的三种方式
    可以多分类的神经网络
  • 原文地址:https://www.cnblogs.com/yizhanhaha/p/3222145.html
Copyright © 2011-2022 走看看