• SDUT 3363 数据结构实验之图论七:驴友计划


     

    数据结构实验之图论七:驴友计划

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    Problem Description

    做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。

    Input

    连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。 

    Output

    在同一行中输出路径长度和收费总额,数据间用空格间隔。 

    Sample Input

    1
    4 5 0 3
    0 1 1 20
    1 3 2 30
    0 3 4 10
    0 2 2 20
    2 3 1 20

    Sample Output

    3 40

    提示:本题为有向图的最短路径求解,可以用到floyd算法找最短路径关于floyd算法以后会写到。

    代码实现如下(g++):
    #include<bits/stdc++.h>
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    int Map[1010][1010];
    int lowcost[1010][1010];
    
    int n,m;
    
    void Floyd()//Floyd算法
    {
        for(int k=0; k<n; k++)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                {
                    if(i != j)
                    {
                        if(Map[i][j]>Map[i][k]+Map[k][j])
                        {
                            Map[i][j] = Map[i][k] + Map[k][j];
                            lowcost[i][j]=lowcost[i][k]+lowcost[k][j];
                        }
                        if(Map[i][j]==Map[i][k]+Map[k][j])
                        {
                            if(lowcost[i][j]>lowcost[i][k]+lowcost[k][j])
                                lowcost[i][j]=lowcost[i][k]+lowcost[k][j];
                        }
                    }
    
                }
            }
        }
    }
    
    int main()
    {
        int t,u,v,l,q,s,d;
        scanf("%d",&t);
        while(t--)
        {
            memset(Map,INF,sizeof(Map));
            memset(lowcost,INF,sizeof(lowcost));
            scanf("%d %d %d %d",&n,&m,&s,&d);
            for(int i=0; i<m; i++)
            {
                scanf("%d %d %d %d",&u,&v,&l,&q);
                Map[u][v]=Map[v][u]=l;
                lowcost[u][v]=lowcost[v][u]=q;
            }
            Floyd();
            printf("%d %d
    ",Map[s][d],lowcost[s][d]);
        }
        return 0;
    }
    
    
    /***************************************************
    Result: Accepted
    Take time: 0ms
    Take Memory: 2028KB
    ****************************************************/
  • 相关阅读:
    如何实现网页程序自动登录(java)?
    Java读取股票信息
    (转)如何以32 bit的方式存取SDRAM?
    在DE2上运行uCOSII
    Ubuntu不能上网问题解决之二
    (转)GNU编译器工具链
    (转)Quartus II文件的管理
    (转)avm_m1_writedata[15:0] 與 avm_m1_writedata[31:0]配合avm_m1_byteenable = 4'b0011意義是否一樣?
    (转)如何將編譯結果,統一放在一個目錄下? (QuartusII)
    (转)如何在DE270使用SSRAM?
  • 原文地址:https://www.cnblogs.com/jkxsz2333/p/9506635.html
Copyright © 2020-2023  润新知