Power Stations HDOJ-3663


//#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什么意思,还行把,模板题

点赞