3 3 5 1 2 2 3 3 1 1 5 1 5 1 5 4 4 5 1 2 2 3 3 4 4 1 1 5 1 5 1 5 1 5
1 5 0 0 0 0 No solution
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
const int N=60*20*60*6,INF=0xffffff;
int n,m;
int U[N],D[N],L[N],R[N];
int row[N],col[N];
int S[N],H[N],ans[N];
int siz;
int node[66][66],mp[66][66];
int st[66],et[66],a,d,num,np[6][6];
int ans1[N],ans2[N],nps[N],npe[N];
/*
int mas[4444][4444];
void print()
{
memset(mas,0,sizeof(mas));
for(int i=m+1;i<siz;i++)
{
mas[row[i]][col[i]]=1;
}
for(int i=0;i<n;i++)
{
if(i%num==0) cout<<endl;
cout<<i%num<<": \t";
for(int j=1;j<=m;j++)
{
cout<<mas[i][j];
if(j%d==a) cout<<" ";
}
cout<<endl;
}
cout<<endl;
}
*/
void init()
{
for(int i=0;i<=m;i++)
{
L[i]=i-1;
R[i]=i+1;
col[i]=i;
U[i]=D[i]=i;
row[i]=-1;
}
R[m]=0;
L[0]=m;
siz=m+1;
memset(H,0,sizeof(H));
memset(S,0,sizeof(S));
S[0]=INF+1;
}
void insert(int r,int c)
{
U[siz]=U[c];
D[siz]=c;
U[D[siz]]=siz;
D[U[siz]]=siz;
if(H[r])
{
L[siz]=L[H[r]];
R[siz]=H[r];
L[R[siz]]=siz;
R[L[siz]]=siz;
}
else H[r]=L[siz]=R[siz]=siz;
row[siz]=r;
col[siz]=c;
S[c]++;
siz++;
}
void build()
{
init();
for(int i=0;i<a;i++)
{
int s,e,j;
insert(i*num,i+1);
for(s=st[i];s<=et[i];s++)
{
for(e=s;e<=et[i];e++)
{
for(j=s;j<=e;j++)
{
insert(i*num+np[s][e],a+i*d+j+1);
for(int k=1;k<node[i][0];k++) insert(i*num+np[s][e],a+node[i][k]*d+j+1);
}
insert(i*num+np[s][e],i+1);
}
}
}
}
void remove(int c)
{
L[R[c]]=L[c];
R[L[c]]=R[c];
for(int i=D[c];i!=c;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 resume(int c)
{
for(int i=U[c];i!=c;i=U[i])
{
for(int j=L[i];j!=i;j=L[j])
{
D[U[j]]=j;
U[D[j]]=j;
S[col[j]]++;
}
}
R[L[c]]=c;
L[R[c]]=c;
}
bool dfs(int k)
{
if(R[0]==0) return true;
int mins=INF,c=0;
for(int t=R[0];t!=0;t=R[t])
{
if(S[t]<mins)
{
mins=S[t];
c=t;
}
}
if(c==0) return false;
remove(c);
for(int i=D[c];i!=c;i=D[i])
{
ans[k]=row[i];
for(int j=R[i];j!=i;j=R[j]) remove(col[j]);
if(dfs(k+1)) return true;
for(int j=L[i];j!=i;j=L[j]) resume(col[j]);
}
resume(c);
return false;
}
int main()
{
int b;
ios::sync_with_stdio(false);
while(scanf("%d %d %d",&a,&b,&d)==3)
{
int i,j,k;
num=d*(d+1)/2+1;
n=a*num;
m=a*d+a;
for(k=1,i=0;i<d;i++) for(j=i;j<d;j++) np[i][j]=k++;
memset(mp,0,sizeof(mp));
for(i=0;i<b;i++)
{
scanf("%d %d",&j,&k);
j--;k--;
if(j<k) swap(j,k);
mp[j][k]=1;
}
for(i=0;i<a;i++) node[i][0]=1;
for(j=0;j<a;j++) for(k=0;k<a;k++) if(mp[j][k])
{
node[j][node[j][0]++]=k;
node[k][node[k][0]++]=j;
}
for(i=0;i<a;i++)
{
scanf("%d %d",&st[i],&et[i]);
st[i]--;et[i]--;
}
build();
//print();
if(!dfs(0))
{
puts("No solution\n");
continue;
}
for(i=0;i<a;i++)
{
j=ans[i]%num;
if(j){for(int s=0;s<d;s++) for(int e=s;e<d;e++) if(np[s][e]==j){ans1[ans[i]/num]=s+1;ans2[ans[i]/num]=e+1;}}
else{ans1[ans[i]/num]=ans2[ans[i]/num]=0;}
}
for(i=0;i<a;i++) printf("%d %d\n",ans1[i],ans2[i]);
puts("");
}
return 0;
}
HDU 3663 dancing links优化搜索,布布扣,bubuko.com
原文:http://blog.csdn.net/w750636248/article/details/20957945