• P2055 [ZJOI2009]假期的宿舍


    P2055 [ZJOI2009]假期的宿舍

    建图是件难事233.

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    struct node
    {
        int point;
        int value;
        int nxt;
    };
    node line[500000];
    int head[5000],tail=-1;
    void add(int x,int y,int z)
    {
        line[++tail].point=y;
        line[tail].value=z;
        line[tail].nxt=head[x];
        head[x]=tail;
        line[++tail].point=x;
        line[tail].value=0;
        line[tail].nxt=head[y];
        head[y]=tail;
    }
    int n;
    int stu[1000];
    int back[1000];
    int dep[1000];
    int cur[1000];
    bool bfs(int begin,int end)
    {
        memset(dep,0,sizeof(dep));
        queue<int>q;
        q.push(begin);
        dep[begin]=1;
        for(int i=0;i<=2*n+1;i++)
            cur[i]=head[i];
        while(!q.empty())
        {
            int pas=q.front();
            q.pop();
            for(int i=head[pas];i!=-1;i=line[i].nxt)
            {
                if(!dep[line[i].point]&&line[i].value)
                {
                    dep[line[i].point]=dep[pas]+1;
                    q.push(line[i].point);
                }
            }
        }
        if(!dep[end])
            return false;
        return true;
    }
    int dfs(int now,int aim,int limte)
    {
        if(now==aim||!limte)
            return limte;
        int flow=0,f;
        for(int i=cur[now];i!=-1;i=line[i].nxt)
        {
            cur[now]=i;
            if(dep[line[i].point]==dep[now]+1&&(f=dfs(line[i].point,aim,min(limte,line[i].value))))
            {
                limte-=f;
                flow+=f;
                line[i].value-=f;
                line[i^1].value+=f;
                if(!limte)
                    break;
            }
        }
        return flow;
    }
    int dinic(int begin,int end)
    {
        int res=0;
        while(bfs(begin,end))
            res+=dfs(begin,end,0x7fffffff);
        return res;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int tot=0;
            tail=-1;
            memset(stu,0,sizeof(stu));
            memset(back,0,sizeof(back));
            scanf("%d",&n);
            for(int i=0;i<=2*n+1;i++)
                head[i]=-1;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&stu[i]);
                if(stu[i])
                    add(i+n,2*n+1,1);
            }
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&back[i]);
                if(!stu[i]||(stu[i]&&!back[i]))
                {
                    add(0,i,1);
                    tot+=1;
                }
            }
            int a;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    scanf("%d",&a);
                    if(a||i==j)
                        add(i,j+n,1);
                }
            int ans=dinic(0,2*n+1);
            if(ans>=tot)
                printf("^_^
    ");
            else
                printf("T_T
    ");	
        }
        
    }
    
  • 相关阅读:
    Android 安卓初探 新建项目
    SQL 根据关联,用一个表的值修改另一个表对应字段的值
    SQL 字符串不足补零
    Android 安卓学习积累
    C#中定义数组
    如何利用地图API制作汽车沿道路行驶的动画?——如何获得道路层数据
    Lambda 表达式(C# 编程指南)
    不定的多条件的过滤
    如何利用【百度地图API】,制作地图地址标记?
    php调用.net生成的.dll文件
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9069384.html
Copyright © 2020-2023  润新知