社区讨论

改得和题解几乎一样都错?!

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

正在加载回复...