多路并归问题:
代码:
1 #include<cstdio> 2 #include<queue> 3 #include<algorithm> 4 #define maxn 760 5 using namespace std; 6 7 struct node 8 { 9 int s,b; 10 node(int s,int b):s(s),b(b) {} 11 bool operator<(const node &t)const 12 { 13 return s>t.s; 14 } 15 }; 16 17 void merge(int *a,int *b,int *c,int n) 18 { 19 priority_queue<node>q; 20 for(int i=0; i<n; i++) 21 q.push(node(a[i]+b[0],0)); 22 for(int i=0; i<n; i++) 23 { 24 node no=q.top(); 25 q.pop(); 26 c[i]=no.s; 27 int bb=no.b; 28 if(bb+1<n) q.push(node(no.s-b[bb]+b[bb+1],bb+1)); 29 } 30 } 31 32 int a[maxn][maxn]; 33 34 int main() 35 { 36 int n; 37 while(scanf("%d",&n)!=EOF) 38 { 39 for(int i=0; i<n; i++) 40 { 41 for(int j=0; j<n; j++) 42 scanf("%d",&a[i][j]); 43 sort(a[i],a[i]+n); 44 } 45 for(int i=1; i<n; i++) 46 merge(a[0],a[i],a[0],n); 47 for(int i=0; i<n-1; i++) 48 printf("%d ",a[0][i]); 49 printf("%d ",a[0][n-1]); 50 } 51 return 0; 52 }