社区讨论
自己的做法改了一天没改出来,看题解写的也还错了
P2055[ZJOI2009] 假期的宿舍参与者 1已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi7crjc4
- 此快照首次捕获于
- 2025/11/20 19:33 4 个月前
- 此快照最后确认于
- 2025/11/20 19:33 4 个月前
先是自己写的:
CPP#include<cstdio>
#include<cstring>
using namespace std;
int bed[100][100],student[100],home[100],book[100],match[100];
int n;
int dfs(int);
int main()
{
int t;
scanf("%d",&t);//t组数据
for(int i=1;i<=t;i++)
{
int rub,know,sum=0,num=0;
memset(student,-1,sizeof(student));
memset(home,-1,sizeof(home));//初始化
scanf("%d",&n);//n个人
for(int j=1;j<=n;j++)
{
scanf("%d",&student[j]);
if(student[j]==0)//不是学生则需要床
num++;
}
for(int j=1;j<=n;j++)
if(student[j]==1)//如果是学生
{
scanf("%d",&home[j]);
if(home[j]==0)//是学生并且不回家则需要床
num++;
}
else
scanf("%d",&rub);
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(j==k)//如果是他自己
{
scanf("%d",&rub);
if(student[j]==1)//如果这个人是学生
if(home[j]==1)//如果这个学生不回家
bed[j][k]=1;//j能睡k的床 在这里是睡自己的床
}
else
{
scanf("%d",&know);
if(know==1)//如果认识
if(student[k]==1)//如果认识的人是学生
{
bed[j][k]=1;
if(student[j]==1 and home[j]==0 and home[k]==0)//如果是不回家学生认识学生则互相可以睡
bed[k][j]=1;
}
}
}
memset(match,-1,sizeof(match));//初始化
for(int i=1;i<=n;i++)//人
{
memset(book,0,sizeof(book));//清零
if((home[i]==0 and student[i]==1) or student[i]==0)//如果是不回家的学生或者不是学生再匈牙利
if(dfs(i))
sum++;
}
if(sum==num)//如果最大匹配数等于需要床的学生数
printf("^_^\n");
else
printf("T_T\n");
}
getchar();
getchar();
return 0;
}
int dfs(int u)
{
for(int i=1;i<=n;i++)//床
if(bed[u][i]==1 and book[i]==0 and student[i]==1)//如果人可以睡这个床 并且这个床没遍历过
{
book[i]=1;
if(match[i]==-1 or dfs(match[i]))
{
match[i]=u;
return 1;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...