1 条题解

  • 1
    @ 2022-12-29 10:15:44

    本题直接使用floyd算法即可。

    因为每条边都有两个信息,所以需要定义一个结构体存储邻接矩阵(邻接表更好,但我不会呀

    struct road
    {
        int d , p;
    }e[1005][1005];
    

    还要注意数据的输入,最终的框架如下:

    scanf("%d %d" , &n , &m);
    do
    {
        //floyd算法
        scanf("%d %d" , &n , &m);//注意,一定是在最后输入,位置不能变!
    }
    while (n && m);
    

    还有一点需要注意,由于道路是双向的,所以在松弛时要将回去的路径也缩短,否则我也不会错那么多次了

    for (int i = 1 ; i <= n ; i++)
            for (int j = 1 ; j <= n ; j++)
                for (int k = 1 ; k <= n ; k++)
                    if (e[j][k].d > e[j][i].d + e[i][k].d){
                        e[j][k].d = e[j][i].d + e[i][k].d;
                        e[j][k].p = e[j][i].p + e[i][k].p;
                        e[k][j].d = e[j][i].d + e[i][k].d;
                        e[k][j].p = e[j][i].p + e[i][k].p;
                    }
    

    AC Code:

    #include <bits/stdc++.h>
    using namespace std;
    #define inf 1e9;
    struct road
    {
        int d , p;
    }e[1005][1005];
    
    int n , m , a , b , s , t;
    int main()
    {
        scanf("%d %d" , &n , &m);
        do
        {
            for (int i = 1 ; i <= m ; i++)
            {
                scanf("%d %d" , &a , &b);
                scanf("%d %d" , &e[a][b].d , &e[a][b].p);
            }
            scanf("%d %d" , &s , &t);
            //初始化
            for (int i = 1 ; i <= n ; i++)
                for (int j = 1 ; j <= n ; j++)
                    if (e[i][j].d == 0 && i != j)
                        e[i][j].d = inf;
    
            for (int i = 1 ; i <= n ; i++)
                for (int j = 1 ; j <= n ; j++)
                    for (int k = 1 ; k <= n ; k++)
                        if (e[j][k].d > e[j][i].d + e[i][k].d){
                            e[j][k].d = e[j][i].d + e[i][k].d;
                            e[j][k].p = e[j][i].p + e[i][k].p;
                            e[k][j].d = e[j][i].d + e[i][k].d;
                            e[k][j].p = e[j][i].p + e[i][k].p;
                        }
      
            printf("%d %d\n" , e[s][t].d , e[s][t].p);
            scanf("%d %d" , &n , &m);//注意,一定是在最后输入,位置不能变!
        }
        while (n && m);
        return 0;
    }
    
    • 1

    信息

    ID
    1140
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    18
    已通过
    13
    上传者