舞蹈链80分求助(悬关)
查看原帖
舞蹈链80分求助(悬关)
912388
chatoudp楼主2024/3/3 09:55

TLE on #7 #9

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,a[505][505],u[5005],d[5005],l[5005],r[5005];
int c[505],cnt,row[5005],col[5005],ans[505];
int s[505];
void csh(){
	for(int i=0;i<=m;i++)
	{
		u[i]=d[i]=i;
		l[i]=i-1; r[i]=i+1;
	}
	l[0]=m; r[m]=0; cnt=m;
}
void link(int x,int y){
	row[++cnt]=x; col[cnt]=y; s[y]++;
	u[cnt]=y;
	d[cnt]=d[y];
	u[d[y]]=cnt;
	d[y]=cnt;
	if(c[x]==0) c[x]=r[cnt]=l[cnt]=cnt;
	else{
		l[cnt]=c[x];
		r[cnt]=r[c[x]];
		l[r[c[x]]]=cnt;
		r[c[x]]=cnt;
	}
}
void sc(int y){
	r[l[y]]=r[y]; l[r[y]]=l[y];
	for(int i=d[y];i!=y;i=d[i])
		for(int j=r[i];j!=i;j=r[j])
			u[d[j]]=u[j],d[u[j]]=d[j],s[col[j]]--;
}
void hf(int y){
	r[l[y]]=y; l[r[y]]=y;
	for(int i=u[y];i!=y;i=u[i])
		for(int j=l[i];j!=i;j=l[j])
			u[d[j]]=j,d[u[j]]=j,s[col[j]]++;
}
bool dance(int dep){
	if(r[0]==0){
		for(int i=1;i<dep;i++) printf("%d ",ans[i]);
		return 1;
	}
	int y=r[0];
	for(int i=r[0];i;i=r[i]) if(s[i]<s[y])		y=i;
	sc(y);
	for(int i=d[y];i!=y;i=d[i]){
		ans[dep]=row[i];
		for(int j=r[i];j!=i;j=r[j]) sc(col[j]);
		if(dance(dep+1)) return 1;
		for(int j=l[i];j!=i;j=l[j]) hf(col[j]);
	}
	hf(y);
	return 0;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	csh();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(a[i][j])
				link(i,j);
	if(!dance(1)) printf("No Solution!") ;
	return 0;
}

2024/3/3 09:55
加载中...