Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:太诡异了这个题……两份代码对于一个测试数据,结果不一样,可是都AC了……这是什么世道?为什么我的WA?继续调试In Reply To:太诡异了这个题……两份代码对于一个测试数据,结果不一样,可是都AC了……这是什么世道?为什么我的WA?继续调试 Posted by:lenglengmajia at 2009-03-24 14:58:51 #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> struct node{ int r,c; }man[10001],home[10001]; int r,c,num_of_man,num_of_home,map[101][101],lx[101],ly[101],match[101]; bool visx[101],visy[101]; int dfs(int t){//寻找完备匹配 int i,tmp; visx[t]=true; for(i=1;i<=num_of_home;i++){ if(!visy[i] && lx[t]+ly[i]==map[t][i]){ tmp=match[i]; visy[i]=true; match[i]=t; if(tmp==0 || dfs(tmp)) return 1; match[i]=tmp; } } return 0; } int main(){ while(scanf("%d%d",&r,&c),r&&c){ getchar(); int i,j,k; char a; num_of_home=0;num_of_man=0; for(i=1;i<=r;i++){//read_data for(j=1;j<=c;j++){ if((a=getchar())=='m'){ man[++num_of_man].r=i; man[num_of_man].c=j; } else if(a=='H'){ home[++num_of_home].r=i; home[num_of_home].c=j; } } getchar(); } //printf("%d %d\n",num_of_man,num_of_home); memset(map,0,sizeof(map)); for(i=1;i<=num_of_man;i++){ for(j=1;j<=num_of_home;j++){ map[i][j]=(int )fabs(man[i].r-home[j].r)+(int )fabs(man[i].c-home[j].c); } } memset(lx,127,sizeof(lx)); memset(ly,0,sizeof(ly)); for(i=1;i<=num_of_man;i++){ for(j=1;j<=num_of_home;j++){ if(map[i][j]<lx[i]) lx[i]=map[i][j];//如果是最大权值匹配 则初始值顶标取最大值 } //若是最小匹配则取最小值 } //KM algorithm memset(match,0,sizeof(match)); for(i=1;i<=num_of_man;i++){// while(1){ memset(visx,0,sizeof(visx));//清零 memset(visy,0,sizeof(visy)); int min=10000000; if(dfs(i)) break;//寻找完备匹配 for(j=1;j<=num_of_man;j++){//找出 min=1000000;x搜索树上y不在搜索树上边 if(visx[j]) //找出顶标最大能改进的d值 for(k=1;k<=num_of_home;k++){ if(!visy[k] && map[j][k]-lx[j]-ly[k]<min)//基于 lx[i]+ly[j]<=map[i][j] 找出map[j][k]-lx[j]-ly[k]的最小值 d min=map[j][k]-lx[j]-ly[k]; //若是最大匹配则应满足 lx[i]+ly[j]>=map[i][j] 找出 } //lx[i]-ly[j]-map[i][j]的最小值 d } for(j=1;j<=num_of_man;j++) if(visx[j]) lx[j]+=min;//用d来改进搜索树上各点的顶标 for(j=1;j<=num_of_home;j++) if(visy[j]) ly[j]-=min; // } } int sum=0; for(i=1;i<=num_of_home;i++) sum+=map[match[i]][i]; printf("%d\n",sum); } return 0; } 结果是142 这个和我一样,不知道哪个对……(这个要用G++才能AC) Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator