首页 > 代码库 > uva 11997 K smallest sums (优先队列 多路归并)
uva 11997 K smallest sums (优先队列 多路归并)
算法入门经典 训练指南 p189
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>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;}};void merge(int *A,int *B,int *C,int n){ priority_queue <Item> q; for(int i=0;i<n;i++) q.push(Item(A[i]+B[0],0)); for(int i=0;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)); }}const int maxn=768;int A[maxn][maxn];int main(){ int n; while(scanf("%d",&n)==1) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) scanf("%d",&A[i][j]); sort(A[i],A[i]+n); } for(int i=1;i<n;i++) merge(A[0],A[i],A[0],n); printf("%d",A[0][0]); for(int i=1;i<n;i++) printf(" %d",A[0][i]); printf("\n"); } return 0;}
uva 11997 K smallest sums (优先队列 多路归并)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。