您的位置:首页 > 其它

BZOJ 1142: [POI2009]Tab【并查集/hash

2016-12-12 15:56 351 查看
有一万种写法2333

可以hash可以并查集,反正xjb写写就好【并查集虚的不行2333竟然没有T

#include<bits/stdc++.h>
#define MAXN 1005
#define base 1000000
#define MAXZ 2000006
using namespace std;	int T,n,m;
inline int read(){
register char ch = getchar();
while((ch^'-')&&!isdigit(ch))	ch = getchar();
register int rtn = 0 , f = 1;
if(ch=='-')	f = -1 , ch = getchar();
while(isdigit(ch))	rtn = rtn*10 + ch - '0' , ch = getchar();
return f*rtn;
}
//====================================================
int a[MAXN][MAXN] , b[MAXN][MAXN];
int fth_col[MAXZ] , fth_lin[MAXZ] , tag[MAXZ];
int find_col(int x){
return x==fth_col[x]? x: fth_col[x] = find_col(fth_col[x]);
}
inline void merge_col(int x,int y){
fth_col[find_col(x)] = find_col(y);
}
int find_lin(int x){
return x==fth_lin[x]? x: fth_lin[x] = find_lin(fth_lin[x]);
}
inline void merge_lin(int x,int y){
fth_lin[find_lin(x)] = find_lin(y);
}

int main(){
//freopen("1.in","r",stdin);
T = read();
while(T--){
n = read() , m = read();
for(register int i=0;i<=MAXZ;++i)	fth_col[i] = fth_lin[i] = i , tag[i] = 0;

a[1][1] = read() + base;
for(int i=2;i<=m;++i)
a[1][i] = read() + base , merge_lin(a[1][i] , a[1][1]);
for(int i=2;i<=n;++i){
a[i][1] = read() + base;
merge_col(a[i][1] , a[1][1]);
for(int j=2;j<=m;++j){
a[i][j] = read() + base;
merge_lin(a[i][1] , a[i][j]);
merge_col(a[i][j] , a[1][j]);
}
}

for(int i=1;i<=n;++i)	for(int j=1;j<=m;++j)	tag[a[i][j]] = 1 , find_col(a[i][j]) , find_lin(a[i][j]);

for(int i=1;i<=n;++i)	for(int j=1;j<=m;++j)	b[i][j] = read() + base;

int flag = 0;
for(int i=2;i<=n;++i){
for(int j=2;j<=m;++j){
if(!tag[b[i][j]]){
flag = 1;
break;
}
if((fth_lin[b[i][j]] ^ fth_lin[b[i][1]]) || (fth_col[b[i][j]] ^ fth_col[b[1][j]])){
flag = 1;
break;
}
}
if(flag)	break;
}
puts(flag?"NIE":"TAK");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: