CF295B Greg and Graph 題解 floyd性質題

題目鏈接:https://codeforces.com/problemset/problem/295/B

題目描述可參見 洛谷

解題思路完全來自 aiiYuu巨佬的博客

一道很好地利用了 floyd 算法性質的題目。

floyd算法

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
long long ans[maxn];
int n, x[maxn], a[maxn][maxn], f[maxn][maxn], d[maxn][maxn];
bool vis[maxn];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            scanf("%d", &a[i][j]);
    for (int i = 1; i <= n; i++) scanf("%d", x+i);
    for (int t = n; t >= 1; t--) {
        int k = x[t];
        vis[k] = true;
        for (int i = 1; i <= n; i++) {
            if (!f[i][k] || f[i][k] > a[i][k])
                f[i][k] = a[i][k];
            if (!f[k][i] || f[k][i] > a[k][i])
                f[k][i] = a[k][i];
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                if (!f[i][j] || f[i][j] > f[i][k] + f[k][j])
                    f[i][j] = f[i][k] + f[k][j];
            }
        }
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (vis[i] && vis[j])
                    ans[t] += f[i][j];
    }
    for (int i = 1; i <= n; i++)
        printf("%lld ", ans[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章