主要是记得传比较算子进去,优先队列要的那个算子参数大概是用来定义优先级的,默认是less,大概是优先级低的先出队。想要从小到大排序要传greater进去。
1 priority_queue< edge,vector<edge>,greater<edge> > Q; 2 Q.push(make_pair(0,1));dis[1]=0; 3 while(!Q.empty()){ 4 int u=Q.top().second;Q.pop(); 5 if(finish[u])continue; 6 cout<<u<<','<<dis[u]<<endl; 7 finish[u]=1; 8 9 for(vector< edge >::iterator ite=G[u].begin();ite!=G[u].end();ite++){ 10 int w=ite->second,v=ite->first; 11 if(dis[u]+w<dis[v]){ 12 dis[v]=dis[u]+w; 13 Q.push(make_pair(dis[v],v)); 14 } 15 } 16 }
poj2442 Sequence
http://poj.org/problem?id=2442
先看只有两组数列的情况,考虑这样一个事实,因为两组合并时产生的n*n个数字中,前n个小的一定比其他的更优,所以考虑一组一组处理,先将第一二组处理,然后用处理的结果跟第三组处理。第一遍写将n*n个数组进行了sort,tle,然后用了堆,保持堆的元素个数是n,复杂度从O(m*n^2*log n*n )变成O(m*n^2*logn)
1 #include <cstdio> 2 #include <algorithm> 3 #include <queue> 4 5 using namespace std; 6 7 const int maxn = 2000+10; 8 9 int v[2][maxn],A[maxn*maxn]; 10 11 int main(int argc, char const *argv[]) 12 { 13 int T;scanf("%d",&T); 14 while(T--){ 15 int m,n; 16 scanf("%d%d",&m,&n); 17 for(int i=0;i<n;i++) 18 scanf("%d",&v[0][i]); 19 20 priority_queue< int > Q; 21 22 for(int ord=1;ord<m;ord++){ 23 for(int i=0;i<n;i++){ 24 scanf("%d",&v[1][i]); 25 for(int j=0;j<n;j++){ 26 int A=v[1][i]+v[0][j]; 27 if(Q.size()<n) 28 Q.push(A); 29 else{ 30 if(A<Q.top()){ 31 Q.pop(); 32 Q.push(A); 33 } 34 } 35 } 36 } 37 for(int i=0;i<n;i++){ 38 v[0][i]=Q.top(); 39 Q.pop(); 40 } 41 } 42 for(int i=n-1;i>=0;i--) 43 printf("%d%c",v[0][i]," "[i==0]); 44 } 45 return 0; 46 }