优先队列
多路归并
#include<bits/stdc++.h>
using namespace std;
struct Item{
int s,b;
Item(int s,int b):s(s),b(b){}
bool operator<(const Item& rhs)const{
return s>rhs.s;
}
};
int A[1020][1020];
void merge(int* A,int* B,int* C,int n)
{
priority_queue<Item>q;
for(int i=1;i<=n;i++)
q.push(Item(A[i]+B[1],1));
for(int i=1;i<=n;i++)
{
Item item=q.top();
q.pop();
C[i]=item.s;
int b=item.b;
if(b+1<=n)
q.push(Item(item.s-B[b]+B[b+1],b+1));
}
}
int main()
{
int k;
while(scanf("%d",&k)==1)
{
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
scanf("%d",&A[i][j]);
sort(A[i]+1,A[i]+k+1);
}
for(int i=2;i<=k;i++)
merge(A[1],A[i],A[1],k);
printf("%d",A[1][1]);
for(int i=2;i<=k;i++)
printf(" %d",A[1][i]);
printf("\n");
}
return 0;
}