• 【bzoj1433】[ZJOI2009]假期的宿舍


    按要求连边,跑匈牙利

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    using namespace std;
     
    #define N 110
     
    int T,n;
     
    int sc[N],go[N];
    int a[N][N];
    int ly[N],vis[N];
     
    struct edge
    {
        int to,next;
    }e[20010];
    int head[N];
    int cnt;
     
    int getint()
    {
        int w=0,q=0;
        char c=getchar();
        while ((c<'0' || c>'9') && c!='-') 
            c=getchar();
        if (c=='-') 
            q=1,c=getchar();
        while (c>='0' && c<='9') 
            w=w*10+c-'0',c=getchar();
        return q?-w:w;
    }  
     
    void link(int x,int y)
    {
        e[++cnt]=(edge){y,head[x]};
        head[x]=cnt;
    }
     
    bool find(int x)
    {
        for (int i=head[x];i;i=e[i].next)
        {
            int t=e[i].to;
            if (!vis[t])
            {
                vis[t]=1;
                if (!ly[t] || find(ly[t]))
                {
                    ly[t]=x;
                    return true;
                }
            }
        }
        return false;
    }
     
    int main()  
    {  
        T=getint();  
        while (T--)  
        {  
            n=getint();  
            for (int i=1;i<=n*2;i++)  
                head[i]=0,ly[i]=0;  
            cnt=0;  
            for (int i=1;i<=n;i++)  
                sc[i]=getint();  
            for (int i=1;i<=n;i++)  
            {  
                go[i]=getint();  
                if (sc[i] && !go[i])
                    link(i,n+i);  
            }  
            for (int i=1;i<=n;i++)  
            {  
                for (int j=1;j<=n;j++)  
                    a[i][j]=getint();  
                if (!sc[i] || (sc[i] && !go[i]))  
                {  
                    for (int j=1;j<=n;j++)  
                        if (a[i][j] && sc[j]) 
                            link(i,j+n);  
                }  
            }  
            int f=1;  
            for (int i=1;i<=n;i++)  
                if (!sc[i] || (sc[i] && !go[i]))  
                {  
                    for (int j=1;j<=n*2;j++)  
                        vis[j]=0;  
                    if (!find(i))
                    {
                        f=0;
                        break;
                    }  
                }  
            if (f) 
                puts("^_^");  
            else
                puts("T_T");  
        }  
        return 0;  
    }  
    

      

  • 相关阅读:
    pfofinet和S7
    A1010 Radix [二分/******]
    A1005 Spell It Right
    最大回文子串长度 [dp]
    HDU 1159 Common Subsequence [最长公共子序列]
    1045 Favorite Color Stripe [动态规划/最长不下降子序列]
    1007 Maximum Subsequence Sum [动态规划]
    数塔问题(递归/递推)
    hdu 畅通工程 [Kruskal/Prime]
    1087 All Roads Lead to Rome [dj]
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5762541.html
Copyright © 2020-2023  润新知