10分求助
查看原帖
10分求助
365433
Mark_M楼主2022/10/1 21:52
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <deque>
#include <list>
#include <map>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <climits>
using namespace std;
const int N = 1005;
int n, m, x;
int mat[N][N], dist[N];


void dij(int s, int e) {
    bool vis[N];
    fill(vis + 1, vis + 1 + n, false);
    vis[s] = true;
    for (int i = 1; i < n; i++) {
        int Min = INT_MAX, p = -1;
        for (int j = 1; j <= n; j++) {
            if (mat[s][j] < Min && vis[j] == false) {
                Min = mat[s][j];
                p = j;
            }
        }
        if (p > 0) {
            vis[p] = true;
        }
        for (int i = 1; i <= n; i++) {
            if (vis[i] == false && mat[p][i] && dist[p] + mat[p][i] < dist[i]) {
                dist[i] = dist[p] + mat[p][i];
            }
        }
    }
}

void Init(int x) {
    fill(dist + 1, dist + 1 + n, INT_MAX);
    for (int j = 1; j <= n; j++) {
        if (mat[x][j]) {
            dist[j] = mat[x][j];
        }
    }
}

int main() {
    cin >> n >> m >> x;
    fill(mat + 1, mat + (n + 1) * (n + 1), INT_MAX);
    int a, b, v;
    for (int i = 1; i <= m; i++) {
        cin >> a >> b >> v;
        mat[a][b] = v;
    }
    int Max = INT_MIN;
    for (int i = 1; i <= n; i++) {
        Init(i);
        dij(i, x);
        int m = dist[x];
        Init(x);
        dij(x, i);
        int n = dist[i];
        if (m + n > Max) {
            Max = m + n;
        }
    }
    cout << Max;
}


改了三个小时……

才拿10分(过了题中的样例输入)

我真的栓Q了啊

2022/10/1 21:52
加载中...