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

P2055 [ZJOI2009] 假期的宿舍

然后是看@[yybyyb](/space/show?uid=21283) 这位dalao的 ```cpp #include<cstdio> #include<cstring> using namespace std; struct node { int v; int next; }bed[10000]; int cnt=0; int first[100]; int book[100],match[100]; int home[100],student[100]; int n,num,sum; void add(int ,int ); int dfs(int); int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { num=0; memset(first,-1,sizeof(first)); /*memset(home,0,sizeof(home)); memset(student,0,sizeof(student));*/ scanf("%d",&n); for(int j=1;j<=n;j++) scanf("%d",&student[j]); for(int j=1;j<=n;j++) { scanf("%d",&home[j]); if(student[j] and home[j]==0)//如果是不回家的学生 add(j,j);//睡自己的床 } for(int j=1;j<=n;j++) if((student[j] and !home[j]) or !student[j]) num++;//统计要床的人数 int rub; for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) { scanf("%d",&rub); if(rub and student[k])//如果认识的人是学生 add(j,k); } memset(match,0,sizeof(match)); sum=0; for(int j=1;j<=n;j++) if((student[j] and home[j]==0) or !student[j]) { memset(book,0,sizeof(book)); if(dfs(i)) sum++; } if(sum==num) printf("^_^\n"); else printf("T_T\n"); } getchar(); getchar(); return 0; } void add(int u,int v) { bed[cnt].v=v; bed[cnt].next=first[u]; first[u]=cnt; cnt++; } int dfs(int u) { for(int i=first[u];i!=-1;i=bed[i].next) { int w=bed[i].v; if(!book[w]) { book[w]=1; if(!match[w] or dfs(match[w])) { match[w]=u; return 1; } } } return 0; } ``` 求dalao指出错误
by 旅人杜 @ 2018-11-08 11:39:08


好的 照题解写的方法是低级错误 循环的是j 但是我dfs(i)了,自己写的做法也是这个错误,但是改正后照题解的过了,自己写的还是错
by 旅人杜 @ 2018-11-08 12:16:48


解决了....
by 旅人杜 @ 2018-11-08 14:14:47


|