社区讨论

自己的做法改了一天没改出来,看题解写的也还错了

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 条回复,欢迎继续交流。

正在加载回复...