【bzoj4057】[Cerc2012]Kingdoms

  闷声大爆搜就好。
  状压判重。
  时间O(n2n)

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define shl(x) (1 << (x))

inline int rd() {
    char c = getchar();
    while (!isdigit(c) && c != '-') c = getchar();
    int x = 0 , f = 1;
    if (c == '-') f = -1 ; else x = c - '0';
    while (isdigit(c = getchar())) x = x * 10 + c - '0';
    return x * f;
}

int n , a[23][23] , c[23] , vis[1 << 21] , ans , all;

void input() {
    n = rd();
    rep (i , 1 , n) c[i] = 0;
    rep (i , 1 , n) rep (j , 1 , n) a[i][j] = rd() , c[i] += a[i][j];
}

void dfs(int s , int t) {
    if (vis[s]) return;
    vis[s] = 1;
    if (t == 1)
        { ans |= s ; return ; }
    rep (i , 1 , n)
        if ((shl(i - 1) & s) && c[i] > 0) {
            rep (j , 1 , n) c[j] -= a[j][i];
            dfs(s ^ shl(i - 1) , t - 1);
            rep (j , 1 , n) c[j] += a[j][i];
        }
}

void solve() {
    ans = 0;
    all = shl(n) - 1;
    rep (i , 0 , all) vis[i] = 0;
    dfs(all , n);
    bool p = 0;
    rep (i , 1 , n) if (shl(i - 1) & ans) {
        if (p) putchar(' ');
        else p = 1;
        printf("%d" , i);
    }
    if (!p) putchar('0');
    //puts("");
}

int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.txt" , "r" , stdin);
    #endif
    per (T , rd() , 1) {
        input();
        solve();
        puts("");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值