hdu 1599(floyd求最小環模板)

題意:
讓你找出至少包含三個點並且值的總和最小的環。

const int maxn = 110;
const i64 INF = INT_MAX;
i64 G[maxn][maxn], dis[maxn][maxn], ans, n;

void floyd() {
    int i, j, k;
    for (k = 1; k <= n; ++k) {
        for (i = 1; i < k; ++i) {
            if (G[k][i] == INF) continue;
            for (j = i+1; j < k; ++j) {
                if (G[k][j] == INF) continue;
                ans = min(ans, G[k][i]+G[k][j]+dis[i][j]);
            }
        }
        for (i = 1; i <= n; ++i) {
            if (dis[i][k] == INF) continue;
            for (j = 1; j <= n; ++j) {
                if (dis[k][j] == INF) continue;
                dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j]);
            }
        }
    }
}

int main() {

    i64 m, a, b, w;
    while (cin >> n >> m) {
        for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) G[i][j] = INF;
        for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) dis[i][j] = INF;
        ans = INF;
        forn(i, m) {
            cin >> a >> b >> w;
            G[a][b] = G[b][a] = dis[a][b] = dis[b][a] = min(G[a][b], w);
        }
        floyd();
        if (ans == INF) cout << "It's impossible." << '\n';
        else cout << ans << '\n';
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章