求助,DLX 不加启发式优化 60 pts,加了反而 T 了
查看原帖
求助,DLX 不加启发式优化 60 pts,加了反而 T 了
121216
18Michael楼主2021/6/13 19:02
#include<cstdio>
#include<vector>
using namespace std;
int n,m,arr_t,ans_t=0;
int la[502],la1[502],ans[502],hx[5502],hy[5502],cnt[502]={};
bool del[5502]={};
typedef pair<int,int> P;
struct aaa
{
	int L,R,U,D;
}arr[5502];
inline void print()
{
	for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
	printf("cnt:");for(int i=1;i<=m;++i)printf("%d%c",cnt[i],i==m? '\n':' ');
	for(int i=0;i<=arr_t;++i)printf("%d:%d %d %d %d\n",i,arr[i].L,arr[i].R,arr[i].U,arr[i].D);
	puts("");
}
inline bool DLX()
{
	//puts("fir:");
	//puts("ans:");for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
	//print();
	if(!(~arr[0].R))return 1;
	int t=arr[0].R,u,v;
	vector<int> vec;
	vector<P> vec1;
	//printf("%d->",t);
	for(int i=arr[t].R;~i;i=arr[i].R)
	{
		//if(i>m)while(1);
		if(cnt[i]>cnt[t])
			t=i;
	}
	//printf("%d\n",t);
	//if(arr[t].L!=0)while(1);
	del[t]=1,arr[arr[t].L].R=arr[t].R;
	if(~arr[t].R)arr[arr[t].R].L=arr[t].L;
	for(int i=arr[t].D;~i;i=arr[i].D)
	{
		for(int j=arr[i].L;~j;j=arr[j].L)
			if(!del[j])
			{
				del[j]=1,--cnt[hy[j]],vec.push_back(j),arr[arr[j].U].D=arr[j].D;
				if(~arr[j].D)arr[arr[j].D].U=arr[j].U;
			}
		for(int j=arr[i].R;~j;j=arr[j].R)
			if(!del[j])
			{
				del[j]=1,--cnt[hy[j]],vec.push_back(j),arr[arr[j].U].D=arr[j].D;
				if(~arr[j].D)arr[arr[j].D].U=arr[j].U;
			}
	}
	//printf("cnt:");for(int i=1;i<=m;++i)printf("%d%c",cnt[i],i==m? '\n':' ');
	//puts("sec:");
	//print();
	//puts("--------------------------------");
	for(int i=arr[t].D;~i;i=arr[i].D)
	{
		vec1.clear(),ans[++ans_t]=hx[i];
		for(int j=arr[i].L,k;~j;j=arr[j].L)
		{
			//printf("j:%d\n",j);
			for(k=arr[j].D;~k;k=arr[k].D)
			{
				//printf("k:%d\n",k);
				for(int l=arr[k].L;~l;l=arr[l].L)
					if(!del[l])
					{
						//printf("l:%d\n",l);
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
				for(int l=arr[k].R;~l;l=arr[l].R)
					if(!del[l])
					{
						//printf(" l:%d\n",l);
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
			}
			for(k=arr[j].U;~arr[k].U;k=arr[k].U)
			{
				for(int l=arr[k].L;~l;l=arr[l].L)
					if(!del[l])
					{
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
				for(int l=arr[k].R;~l;l=arr[l].R)
					if(!del[l])
					{
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
			}
			//printf("vs:%d k:%d\n",vec1.size(),k);
			if(!del[k])
			{
				del[k]=1,vec1.push_back(P(k,1)),arr[arr[k].L].R=arr[k].R;
				if(~arr[k].R)arr[arr[k].R].L=arr[k].L;
			}
		}
		for(int j=i,k;~j;j=arr[j].R)
		{
			//printf("j:%d\n",j);
			for(k=arr[j].D;~k;k=arr[k].D)
			{
				//printf("k:%d\n",k);
				for(int l=arr[k].L;~l;l=arr[l].L)
					if(!del[l])
					{
						//printf("l:%d\n",l);
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
				for(int l=arr[k].R;~l;l=arr[l].R)
					if(!del[l])
					{
						//printf(" l:%d\n",l);
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
			}
			for(k=arr[j].U;~arr[k].U;k=arr[k].U)
			{
				for(int l=arr[k].L;~l;l=arr[l].L)
					if(!del[l])
					{
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
				for(int l=arr[k].R;~l;l=arr[l].R)
					if(!del[l])
					{
						del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
						if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
					}
			}
			//printf("vs:%d k:%d\n",vec1.size(),k);
			if(!del[k])
			{
				del[k]=1,vec1.push_back(P(k,1)),arr[arr[k].L].R=arr[k].R;
				if(~arr[k].R)arr[arr[k].R].L=arr[k].L;
			}
		}
		if(DLX())return 1;
		--ans_t;
		for(int j=vec1.size()-1;~j;--j)
		{
			del[vec1[j].first]=0;
			if(vec1[j].second)
			{
				arr[arr[vec1[j].first].L].R=vec1[j].first;
				if(~arr[vec1[j].first].R)arr[arr[vec1[j].first].R].L=vec1[j].first;
			}
			else
			{
				++cnt[hy[vec1[j].first]],arr[arr[vec1[j].first].U].D=vec1[j].first;
				if(~arr[vec1[j].first].D)arr[arr[vec1[j].first].D].U=vec1[j].first;
			}
		}
	}
	for(int i=vec.size()-1;~i;--i)
	{
		del[vec[i]]=0,++cnt[hy[vec[i]]],arr[arr[vec[i]].U].D=vec[i];
		if(~arr[vec[i]].D)arr[arr[vec[i]].D].U=vec[i];
	}
	//if(arr[t].L!=0)while(1);
	del[t]=0,arr[arr[t].L].R=t;
	if(~arr[t].R)arr[arr[t].R].L=t;
	//puts("third:");
	//print();
	//puts("return 0");
	return 0;
}
int main()
{
	//freopen("1.txt","r",stdin);
	scanf("%d%d",&n,&m),arr_t=m;
	for(int i=0;i<=m;++i)arr[i]=(aaa){i-1,i<m? i+1:-1,-1,-1},la[i]=i;
	for(int i=1;i<=n;++i)la1[i]=-1;
	for(int i=1,x;i<=n;++i)
		for(int j=1;j<=m;++j)
		{
			scanf("%d",&x);
			if(x)
			{
				arr[++arr_t]=(aaa){la1[i],-1,la[j],-1},hx[arr_t]=i,hy[arr_t]=j,++cnt[j];
				if(~la1[i])arr[la1[i]].R=arr_t;arr[la[j]].D=arr_t,la1[i]=la[j]=arr_t;
			}
		}
	//print();
	if(DLX())for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
	else puts("No Solution!");
	return 0;
}
/*
6 7
0 0 1 0 1 1 0
1 0 0 1 0 0 1
0 1 1 0 0 1 0
1 0 0 1 0 0 0
0 1 0 0 0 0 1
0 0 0 1 1 0 1

5 7
1 1 1 0 0 0 0
0 0 1 1 1 0 1
0 0 0 1 1 1 1
1 0 0 0 1 1 1
0 0 0 1 1 0 0


*/

这是原代码,启发式优化在第 29~34 行,不知哪里有问题,求大佬帮忙看下,谢谢~

(或者给一组小一点的 Hack 数据也行

2021/6/13 19:02
加载中...