BZOJ P4057 [CERC2012] Kingdoms【狀態壓縮】
阿新 • • 發佈:2018-12-14
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define db double #define sg string #define rep(i,x,y) for(int i=(x);i<=(y);i++) #define repl(i,x,y) for(int i=(x);i<(y);i++) #define repd(i,x,y) for(int i=(x);i>=(y);i--) using namespace std; const int N=3e3+5; const int Inf=1e18; int f[1<<21]; int t,n,all,ans[N],mp[N][N]; inline int read() { int x=0;char ch=getchar();bool f=0; while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } int main() { t=read(); while(t--) { n=read();all=(1<<n)-1; repl(i,0,n) repl(j,0,n) mp[i][j]=read(); rep(i,0,all) f[i]=0;f[0]=1; rep(s,0,all) if(f[s]) repl(i,0,n) if(!(s>>i&1)&&!f[s|(1<<i)]) { int sum=0; repl(j,0,n) if(!(s>>j&1)) sum-=mp[i][j]; if(sum<0) f[s|(1<<i)]=1; } int cnt=0; repl(i,0,n) if(f[all^(1<<i)]) ans[++cnt]=i+1; if(cnt) rep(i,1,cnt) printf("%d ",ans[i]); else printf("0");printf("\n"); } return 0; }