社区讨论
改得和题解几乎一样都错?!
P2055[ZJOI2009] 假期的宿舍参与者 5已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mi6w5fz5
- 此快照首次捕获于
- 2025/11/20 11:48 4 个月前
- 此快照最后确认于
- 2025/11/20 23:49 4 个月前
求dalao们找错
ps:并不是抄题解,调了四十分钟后总是0分
0分代码:
CPP#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int to,next;
}dis[3001];
int t,n,num,cnt; int head[60],mat[60],a[60],b[60],c[60],visit[60];
inline void add(int u,int v){
dis[++num].to=v; dis[num].next=head[u]; head[u]=num;
}
int dfs(int x){
for(int i=head[x];i;i=dis[i].next){
int v=dis[i].to;
if(!visit[v]){
visit[v]=true;
if(!mat[v]){
mat[v]=x;
return 1;
}else if(dfs(mat[v])){
mat[v]=x;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d",&t);
while(t--){
memset(head,0,sizeof(head));
memset(mat,0,sizeof(mat));
num=cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i);
for(int i=1;i<=n;++i){
scanf("%d",b+i);
if(a[i]&&!b[i])
add(i,i);
if( (a[i]&&!b[i]) || (!a[i]) )
c[i]=1,++cnt;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
int shu;
scanf("%d",&shu);
if(!shu) continue;
if(a[j])
add(i,j);
}
int k=0;
for(int i=1;i<=n;++i)
if(c[i]){
memset(visit,0,sizeof(visit));
if(dfs(i)) ++k;
/*if(!dfs(i)){
printf("T_T\n");
k=1;
break;
}*/
}
/*if(!k)
printf("^_^\n");*/
if(k==cnt)
printf("^_^\n");
else
printf("T_T\n");
}
}/*
1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
*/
题解:
CPP#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAX=100;
const int MAXL=10000;
struct Line
{
int v,next;
}e[MAXL];
int h[MAX],cnt=0,tot;
int T,n;
int home[MAX];
int school[MAX],a,sum;
inline void Add(int u,int v)
{
e[cnt]=(Line){v,h[u]};
h[u]=cnt++;
}
int match[MAX];
bool vis[MAX];
bool DFS(int x)
{
for(int i=h[x];i!=-1;i=e[i].next)
{
int v=e[i].v;
if(!vis[v])
{
vis[v]=true;
if(!match[v]||DFS(match[v]))
{
match[v]=x;
return true;
}
}
}
return false;
}
int main()
{
cin>>T;
while(T--)
{
cnt=tot=0;
memset(h,-1,sizeof(h));
cin>>n;
for(int i=1;i<=n;++i)
cin>>school[i];
for(int i=1;i<=n;++i)
{
cin>>home[i];
if(home[i]==0&&school[i])//如果此人是在校学生并且不回家
Add(i,i);//可以睡自己的床
}
for(int i=1;i<=n;++i)//统计要床的人
if(!school[i]||(school[i]&&!home[i]))
++tot;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
cin>>a;
if(a&&school[j])//如果i认识j并且j是学生
Add(i,j);//i可以睡j的床
}
}
memset(match,0,sizeof(match));
sum=0;
for(int i=1;i<=n;++i)
{
if((school[i]&&home[i]==0)||!school[i])//要么是学生在学校,要么是外来的人
{
memset(vis,0,sizeof(vis));
if(DFS(i))++sum;
}
}
if(sum==tot)
cout<<"^_^"<<endl;
else
cout<<"T_T"<<endl;
}
return 0;
}
回复
共 12 条回复,欢迎继续交流。
正在加载回复...