1. 程式人生 > >BZOJ P4057 [CERC2012] Kingdoms【狀態壓縮】

BZOJ P4057 [CERC2012] Kingdoms【狀態壓縮】

#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;
}