Luogu P2055 [ZJOI2009]假期的宿舍
作者:互联网
这个建图真玄.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");
}
}
标签:head,vis,int,Luogu,cnt,55,P2055,ZJOI2009,match 来源: https://www.cnblogs.com/Y15BeTa/p/11324413.html