求助
查看原帖
求助
982681
D0000楼主2024/9/17 15:05

WA on 33

#include<bits/stdc++.h>
#define FIO(file) freopen(file".in","r",stdin),freopen(file".out","w",stdout)
using namespace std;
const int N=1005;
const int inf=1e9+7;
 
static char buf[1000000],*p1=buf,*p2=buf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
inline int wrd(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+c-48;c=getchar();}return x*f;}
inline void write(int x){static char buf[20];static int len=-1;if(x<0)putchar('-'),x=-x;do buf[++len]=x%10,x/=10;while(x);while(len>=0)putchar(buf[len--]+48);}
 
int n,a[N][N],fa[N],w[N];
 
int fd(int x){
	if(x==fa[x]) return x;
	int t=fd(fa[x]);
	w[x]^=w[fa[x]];
	return fa[x]=t;
}
void uty(int x,int y,int _w){
	int fx=fd(x),fy=fd(y);
	fa[fx]=fy,w[fx]=w[x]^w[y]^_w;
}
 
void solve(){
	n=wrd();
	for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) a[i][j]=wrd();
	for(int i=1;i<=n;++i) fa[i]=i,w[i]=0;
	
	for(int i=1;i<=n;++i){
		for(int j=i+1;j<=n;++j){
			if(a[i][j]==a[j][i]) continue;
			int fi=fd(i),fj=fd(j),o=a[i][j]>a[j][i];
			if(fi==fj){
				if(w[i]^w[j]) swap(a[i][j],a[j][i]);
			}else{
				if(o) uty(i,j,1),swap(a[i][j],a[j][i]);
				else uty(i,j,0);
			}
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j) write(a[i][j]),putchar(' ');
		puts("");
	}
}
 
signed main(){
	// FIO("swap");
	int T=wrd();
	while(T--) solve();
	return 0;
}

2024/9/17 15:05
加载中...