求助大佬,用的dj算法,反向图,2,4无法通过
查看原帖
求助大佬,用的dj算法,反向图,2,4无法通过
985034
Bysq楼主2023/5/8 22:44
#include<iostream>
#include<cstring>
using namespace std;

const int MAXN = 1e3;
const int MAXM = 250000;
const int INF = 0x3f3f3f3f;

struct MGraph{
    int n, m;
    int edges[MAXN][MAXN];
};

void init_MGraph(MGraph& g, int n){
    memset(g.edges, INF, sizeof(g.edges));
    g.n = n;
    g.m = 0;
}

void add_edge(MGraph& g, int a, int b, int l){
    g.edges[a][b] = l;
    g.m++;
}

void Dijkstra(MGraph g, int v, int* dist, int* path){
    int s[MAXN];
    memset(s, 0, sizeof(s));
    int mindist, i, j, u;
    s[v] = 1;
    path[v] = 0;
    for(int i=0; i<g.n; i++){
        dist[i] = g.edges[v][i];
        s[i] = 0;
        if(g.edges[v][i] < INF){
            path[i] = v;
        }
        else{
            path[i] = -1;
        }
    }
    for(int i=0; i<g.n-1; i++){
        mindist = INF;
        for(int j=0; j<g.n; j++){
            if(s[j] == 0 && dist[j] < mindist){
                u=j;
                mindist=dist[j];
            }
        }
        s[u]=1;
        for(int j=0; j<g.n; j++){
            if(s[j] == 0){
                if(g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j]){
                    dist[j] = dist[u] + g.edges[u][j];
                    path[j] = u;
                }
            }
        }
    }
}

int main(){
    int N, M, X;
    while(cin >> N >> M >> X){
        int a, b, c;
        int ans = 0;
        MGraph g1, g2;
        init_MGraph(g1, N);
        init_MGraph(g2, N);
        for(int i=0; i<M; i++){
            cin >> a >> b >> c;
            add_edge(g1, a-1, b-1, c);
            add_edge(g2, b-1, a-1, c);
        }
        int dist1[MAXN], path1[MAXN];
        int dist2[MAXN], path2[MAXN];
        Dijkstra(g1, X-1, dist1, path1);
        Dijkstra(g2, X-1, dist2, path2);
        for(int i=0; i<N; i++){
            ans = max(ans, dist1[i] + dist2[i]);
        }
        cout << ans << endl;
    }
    return 0;
}

2023/5/8 22:44
加载中...