//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<cctype>
#include<string>
#include<algorithm>
#include<iostream>
#include<ctime>
#include<map>
#include<set>
using namespace std;
#define MP(x,y) make_pair((x),(y))
#define PB(x) push_back(x)
typedef __int64 LL;
//typedef unsigned __int64 ULL;
/* ****************** */
const int INF=100011122;
const double INFF=1e100;
const double eps=1e-8;
const LL mod=9999991;
const int NN=10000010;
const int MM=2000010;
/* ****************** */
const int maxnode = 370000+375;
const int maxn = 370;
const int maxr = 1005;
int ansd,ans[maxn];
int sz,he[maxr],s[maxn];
int row[maxnode],col[maxnode];
int upp[maxnode],dow[maxnode],lef[maxnode],rig[maxnode];
bool mat[65][65];
int re[maxr][3],maxx[maxr][2];
void dlkinit(int n)
{
memset(he,-1,sizeof(he));
int i;
for(i=0;i<=n;i++)
{
upp[i]=dow[i]=i;
lef[i]=i-1;
rig[i]=i+1;
s[i]=0;
}
lef[0]=n;
rig[n]=0;
sz=n+1;
}
void dlkadd(int r,int c)
{
row[sz]=r,col[sz]=c;
s[c]++;
upp[sz]=upp[c];
dow[sz]=c;
dow[upp[c]]=sz;
upp[c]=sz;
if(he[r]==-1)
{
he[r]=lef[sz]=rig[sz]=sz;
}
else
{
lef[sz]=lef[he[r]];
rig[sz]=he[r];
rig[lef[sz]]=sz;
lef[he[r]]=sz;
}
sz++;
}
void dlkremove(int c)
{
lef[rig[c]]=lef[c];
rig[lef[c]]=rig[c];
int i,j;
for(i=dow[c];i!=c;i=dow[i])
{
for(j=rig[i];j!=i;j=rig[j])
{
upp[dow[j]]=upp[j];
dow[upp[j]]=dow[j];
s[col[j]]--;
}
}
}
void dlkrestore(int c)
{
int i,j;
for(i=upp[c];i!=c;i=upp[i])
{
for(j=lef[i];j!=i;j=lef[j])
{
upp[dow[j]]=j;
dow[upp[j]]=j;
s[col[j]]++;
}
}
lef[rig[c]]=c;
rig[lef[c]]=c;
}
bool dlkdfs(int d)
{
if(rig[0]==0)
{
ansd=d;
return true;
}
int i,j,c=rig[0];
for(i=rig[0];i!=0;i=rig[i])
{
if(s[i]<s[c])
c=i;
}
dlkremove(c);
for(i=dow[c];i!=c;i=dow[i])
{
ans[d]=row[i];
for(j=rig[i];j!=i;j=rig[j])dlkremove(col[j]);
if(dlkdfs(d+1))return true;
for(j=rig[i];j!=i;j=rig[j])dlkrestore(col[j]);
}
dlkrestore(c);
return false;
}
int main()
{
int n,m,d,i,j,k,jj,kk;
int u,v,si,ei,tol;
while(scanf("%d%d%d",&n,&m,&d)!=EOF)
{
dlkinit(n*d+n);
memset(mat,false,sizeof(mat));
while(m--)
{
scanf("%d%d",&u,&v);
mat[u][v]=mat[v][u]=true;
}
tol=0;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&si,&ei);
dlkadd(++tol,i);
re[tol][0]=i;
re[tol][1]=0;
re[tol][2]=0;
for(j=si; j<=ei; j++)
{
for(k=j; k<=ei; k++)
{
tol++;
dlkadd(tol,i);
re[tol][0]=i;
re[tol][1]=j;
re[tol][2]=k;
for(jj=j; jj<=k; jj++)//这些for啥意思
{
for(kk=1; kk<=n; kk++)
{
if(mat[i][kk]||i==kk)
{
dlkadd(tol,jj*n+kk);
}
}
}
}
}
}
ansd=-1;
dlkdfs(0);
}
return 0;
}
习惯叫跳舞算法,嘿嘿嘿
不知道输入后一堆for什么意思,还行把,模板题