zoukankan      html  css  js  c++  java
  • HUST 1017(DLX)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65998#problem/A

    题意:求01矩阵的精确覆盖。

    DLX学习资料:http://www.cnblogs.com/grenet/p/3145800.html

                        http://blog.csdn.net/mu399/article/details/7627862

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 10007
    #define inf 0x3f3f3f3f
    #define N 100010
    #define FILL(a,b) (memset(a,b,sizeof(a)))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    const int maxnode=100010;
    const int MaxN=1010;
    const int MaxM=1010;
    struct DLX
    {
        int n,m,size;
        int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode];
        int  H[MaxN],S[MaxM];
        int ansd,ans[MaxN];
        void init(int _n,int _m)
        {
            n=_n;m=_m;
            for(int i=0;i<=m;i++)
            {
                S[i]=0;
                U[i]=D[i]=i;
                L[i]=i-1;
                R[i]=i+1;
            }
            R[m]=0;L[0]=m;
            size=m;
            for(int i=1;i<=n;i++)H[i]=-1;
        }
        void Link(int r,int c)
        {
            ++S[Col[++size]=c];
            Row[size]=r;
            D[size]=D[c];
            U[D[c]]=size;
            U[size]=c;
            D[c]=size;
            if(H[r]<0)H[r]=L[size]=R[size]=size;
            else
            {
                R[size]=R[H[r]];
                L[R[H[r]]]=size;
                L[size]=H[r];
                R[H[r]]=size;
            }
        }
        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)
        {
            L[R[c]]=R[L[c]]=c;
            for(int i=U[c];i!=c;i=U[i])
                for(int j=L[i];j!=i;j=L[j])
                ++S[Col[U[D[j]]=D[U[j]]=j]];
        }
        bool Dance(int d)
        {
            if(R[0]==0)
            {
                ansd=d;
                return true;
            }
            int c=R[0];
            for(int i=R[0];i!=0;i=R[i])
                if(S[i]<S[c])c=i;
            Remove(c);
            for(int i=D[c];i!=c;i=D[i])
            {
                ans[d]=Row[i];
                for(int j=R[i];j!=i;j=R[j])Remove(Col[j]);
                if(Dance(d+1))return true;
                for(int j=L[i];j!=i;j=L[j])Resume(Col[j]);
            }
            Resume(c);
            return false;
        }
    };
    DLX g;
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)>0)
        {
            g.init(n,m);
            for(int i=1;i<=n;i++)
            {
                int num,j;
                scanf("%d",&num);
                while(num--)
                {
                    scanf("%d",&j);
                    g.Link(i,j);
                }
            }
            if(!g.Dance(0))puts("NO");
            else
            {
                printf("%d",g.ansd);
                for(int i=0;i<g.ansd;i++)printf(" %d",g.ans[i]);
                puts("");
    
            }
        }
    }
    View Code
  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/lienus/p/4245338.html
Copyright © 2011-2022 走看看