求调
查看原帖
求调
655798
lflby楼主2024/12/4 19:34

样例没过

#include <bits/stdc++.h>
#define int long long
using namespace std;
int read()
{
	int res = 0,f = 1;
	char ch = getchar();
	while (ch<'0'||ch>'9') f = (ch=='-'?-1:1),ch = getchar();
	while (ch>='0'&&ch<='9') res = (res<<3)+(res<<1)+(ch^48),ch = getchar();
	return res*f;
}
void write(int x)
{
	if (x<0) putchar('-'),x = -x;
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
void writech(int x,char ch){write(x),putchar(ch);}
const int N = 505;
int n,m;
int a[N][N];
int s[N]/*每列节点数*/,h[N]/*每行头结点*/;
int cnt;//1的个数
int l[N],r[N],u[N],d[N],row[N],col[N];
int ans[N];
void init()
{
	for (int i = 0; i <= m; i++)
	{
		row[i]=0;col[i]=i;
		u[i]=d[i]=i;
		l[i]=i-1;r[i]=i+1;
		s[i]=0;
	}
	l[0]=m;
	r[m]=0;
	memset(h,-1,sizeof(h));
	cnt=m+1;
}
void add(int x,int y)
{
	s[y]++;
	row[cnt]=x;col[cnt]=y;
	u[cnt]=u[y];d[cnt]=y;
	u[y]=cnt;
	d[u[y]]=cnt;
	if (h[x]==-1)
	{
		h[x]=cnt;
		l[cnt]=r[cnt]=cnt;
	}
	else
	{
		l[cnt]=l[h[x]];
		r[cnt]=h[x];
		r[l[h[x]]]=cnt;
		l[h[x]]=cnt;
	}
	cnt++;
}
void shan(int y)
{
	l[r[y]]=l[y];
	r[l[y]]=r[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 hui(int 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]]++;
		}
	}
	l[r[y]]=r[l[y]]=y;
}
bool dance(int deep)
{
	if (r[0]==0)
	{
		for (int i = 0; i < deep; i++) writech(ans[i],' ');
		return true;
	}
	int c = r[0];
	for (int i = r[0]; i != 0; i = r[i]) if (s[i]<s[c]) c=i;
	shan(c);
	for (int i = d[c]; i != c; i = d[i])
	{
		ans[deep]=row[i];
		for (int j = r[i]; j != i; j = r[j]) shan(col[j]);
		if (dance(deep+1)) return true;
		for (int j = l[i]; j != i; j = l[j]) hui(col[j]);
	}
	hui(c);
	return false;
}
signed main()
{
	n=read(),m=read();
	init();
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			a[i][j]=read();
			if (a[i][j]==1) add(i,j);
		}
	}
	if (!dance(0)) puts("No Solution!");
	return 0;
}
2024/12/4 19:34
加载中...