在线评判PS [Floyd_Warshal,C ++]

时间:2017-02-27 12:02:16

标签: c algorithm floyd-warshall

我正在解决这个问题 https://www.acmicpc.net/problem/1238#

您可以点击按钮更改语言 enter image description here

我想出的想法是找到从Kth到第二个,第二个到第K个的最短距离之和

所以这是我的完整源代码

#include <stdio.h>
#define INF 999999
#define min(x,y) ((x)>(y)?(y):(x))
using namespace std;

int ans = 0;
int n,m,x;
int d[1001][1001];

void Floyd_Warshal(){
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            if(i==j) d[i][j]=0;
        }
    }
    for(int k=1; k<=n; k++){
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }
}

void solve(){
    for(int i=1; i<=n; i++){
        if(i==2) continue;
        if(d[i][2] + d[2][i]>ans) ans = d[i][2] + d[2][i];
        //printf("%d = %d+%d \n",ans,d[i][2],d[2][i]);
    }
}

int main(){
    scanf("%d %d %d",&n,&m,&x);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++) d[i][j] = INF;
    }
    for(int i=0; i<m; i++){
        int u,v,t;
        scanf("%d %d %d",&u,&v,&t);
        d[u][v] = t;
    }   
    Floyd_Warshal();
    solve();
    printf("%d\n",ans);
    return 0;
}

我认为Floyd_warshal()函数没问题。

但是,我想我采取了错误的方法(上面提出的想法)来解决问题所以我只想问我的想法是否正确解决问题。

1 个答案:

答案 0 :(得分:0)

Floyd-Warshall算法的复杂性是 O(n 3 。它将是TL。

此任务的解决方案是执行 SSSP (单源最短路径)。它可以有效地使用 Dijkstra算法。您可以在场X上执行Dijkstra算法,然后在边缘反转的情况下再次执行此算法。如果您使用优先级队列或设置它,它具有 O(m logn)复杂性。谷歌为此提供了许多信息,例如12

在此之后,您的想法是正确的,您应该为每个农场D[i][X] + D[i][X]取最大值i。虽然您已经编写了2而不是x,但它可能是拼写错误,或者是测试代码。