直接用优先队列bfs+set判重水过,需要注意的是,因为m<=100,所以用short就可以不超内存了= =!
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #include<set> 6 using namespace std; 7 int ar[105][2005],n,m; 8 struct data 9 { 10 short p[105]; 11 int sum; 12 bool operator<(const data &ne)const 13 { 14 if(sum!=ne.sum) 15 return sum>ne.sum; 16 else 17 { 18 for(int i=0;i<m;i++) 19 { 20 if(p[i]!=ne.p[i]) 21 return p[i]>ne.p[i]; 22 } 23 return false; 24 } 25 } 26 }; 27 priority_queue<data> Q; 28 set<data> ss; 29 int main() 30 { 31 int T; 32 for(scanf("%d",&T);T;T--) 33 { 34 scanf("%d%d",&m,&n); 35 for(int i=0;i<m;i++) 36 { 37 for(int j=0;j<n;j++) 38 scanf("%d",&ar[i][j]); 39 sort(ar[i],ar[i]+n); 40 } 41 data a; 42 while(!Q.empty()) 43 Q.pop(); 44 memset(a.p,0,sizeof(a.p)); 45 a.sum=0; 46 for(int i=0;i<m;i++) 47 a.sum+=ar[i][0]; 48 Q.push(a); 49 ss.clear(); 50 for(int i=0;i<n;i++) 51 { 52 a=Q.top(); 53 Q.pop(); 54 if(ss.find(a)!=ss.end()) 55 { 56 i--; 57 continue; 58 } 59 ss.insert(a); 60 if(i) 61 printf(" "); 62 printf("%d",a.sum); 63 for(int j=0;j<m;j++) 64 { 65 a.p[j]++; 66 a.sum+=ar[j][a.p[j]]-ar[j][a.p[j]-1]; 67 Q.push(a); 68 a.sum-=ar[j][a.p[j]]-ar[j][a.p[j]-1]; 69 a.p[j]--; 70 } 71 } 72 printf("\n"); 73 } 74 return 0; 75 }