uva 11997 - K Smallest Sums

多路并归问题:

代码:

 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\n",a[0][n-1]);
50     }
51     return 0;
52 }
View Code

 

posted @ 2013-10-24 10:13  Yours1103  阅读(189)  评论(0编辑  收藏  举报