2531:Network Saboteur

keyword

グラフ BruteForce C++

概要

N(<=20)個のノードのグラフがあり、各ノード間にコストが与えられる。ノードを互いに素な2つの集合A,Bに分割してSum_(i in A, j in B) C_ijが最大になるようにしたい。その最大値を求める問題。
サイズが小さいのでBruteForceを考える。分割が2^19(最後の一個は固定)で和をとるのが|A|*20位といささか厳しい。取りあえず投げてみたら何とか通った。多分想定解ではないと思うけど。

int main(){
    int n, i, j, mask, ans=0;
    int traffic[20][20];

    scanf("%d",&n);
    REP(i,n)REP(j,n)scanf("%d",traffic[i]+j);

    REP(mask,(1<<(n-1))){
        int tmp = 0;
        REP(i,n)if(mask & (1<<i))REP(j,n)if(!(mask & 1<<j)){
            tmp += traffic[i][j];
        }
        if(tmp > ans) ans = tmp;
    }

    printf("%d\n",ans);
    return 0;
}