首页 > 其他 > 详细

Luogu P2055 [ZJOI2009]假期的宿舍

时间:2019-08-09 00:34:08      阅读:105      评论:0      收藏:0      [点我收藏+]

这个建图真玄.jpg

简直是常识题

然而我常识不足QwQ

话说题解里的代码在我看来不美观所以抄不了题解 于是debug一个小时QwQ

给萌新一点活路吧

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int t,n,in[55],back[55],head[55],vis[55],match[55],cnt;

vector<int> pp,bed;

struct edge{
    int v,next;
}e[100005];

inline void add(int u,int v){
    e[++cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}

inline bool dfs(int u){
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        if(!vis[v]){
            vis[v]=1;
            if(match[v]==-1||dfs(match[v])){
                match[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    scanf("%d",&t);
    while(t--){
        memset(head,-1,sizeof(head));
        memset(match,-1,sizeof(match));
        pp.clear();bed.clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&in[i]);
        for(int i=1;i<=n;i++){
            scanf("%d",&back[i]);
            if(in[i])bed.push_back(i);
            if(!in[i]||!back[i])pp.push_back(i);
        }
        for(int i=1;i<=n;i++){
            if(in[i]&&!back[i])add(i,i);//if要加 
            for(int j=1;j<=n;j++){
                int x;
                scanf("%d",&x);
                if(x){
                    if(in[i]&&(!in[j]||!back[j]))add(i,j);
                    if(in[j]&&(!in[i]||!back[i]))add(j,i);
                }
            }
        }
        int tot=0;
        for(int i=0;i<=bed.size()-1;i++){
            memset(vis,0,sizeof(vis));
            tot+=dfs(bed[i]);
        }
        if(tot==pp.size())printf("^_^\n");
        else printf("T_T\n");
    }
}

Luogu P2055 [ZJOI2009]假期的宿舍

原文:https://www.cnblogs.com/Y15BeTa/p/11324413.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!