【題解】Codeforces 1205B. Shortest Cycle

【題目敘述】http://codeforces.com/contest/1205/problem/B

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
 
int n, dis[130][130], g[130][130];
long long x, a[100005];
 
int main() {
    cin >> n;
    int cnt = 0;
    for (int i = 0; i < n; i++){
        cin >> x;
        if (x) a[++cnt] = x;
    }
    if (cnt > 128){
        cout << 3;
        return 0;
    }
    n = cnt;
    memset(dis, 0x3F, sizeof(dis));
    memset(g, 0x3F, sizeof(g));
    for (int i = 1; i <= n; i++){
        for (int j = i+1; j <= n; j++){
            if ((a[i]&a[j])){
                dis[i][j] = 1;
                dis[j][i] = 1;
                g[i][j] = 1;
                g[j][i] = 1;
            }
        }
    }
    int ans = 10005;
    for (int k = 1; k <= n; k++){
        for (int i = 1; i <= n; i++){
            if (i == k) continue;
            for (int j = i+1; j <= n; j++){
                if (j == k) continue;
                if (g[k][i] < 105 && g[k][j] < 105 && dis[i][j] < 10000){
                    ans = min(ans, g[k][i]+g[k][j]+dis[i][j]);
                }
            }
        }
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                if (dis[i][k]+dis[k][j] < dis[i][j]) dis[i][j] = dis[i][k]+dis[k][j];
            }
        }
    }
    if (ans == 10005) cout << -1;
    else cout << ans << "\n";
}
分享本文 Share with friends