dijkstra补充

dijkstra主要写法:

priority_queue<pair<int,int> >q;
//大根堆
//dis第一维为dis的相反数 

void dijkstra(){
    memset(dis,inf,sizeof dis);
    memset(vis,0,sizeof vis);
    dis[1]=0;
    q.push(make_pair(0,1));
    while(q.size()){
        int u=q.top().second;q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].v,w=e[i].w;
            if(dis[v]>dis[u]+w)
               dis[v]=dis[u]+w;
               q.push(make_pair(-dis[v],v));
        }
    }
}

pair以first为关键字,那么可以放置相反数转换根堆为小根堆

测试:

#include<bits/stdc++.h>

using namespace std;

int n,a[100];
priority_queue<pair<int,int> > q;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
       cin>>a[i];
       q.push(make_pair(a[i],i) );
    }
    while(q.size()){
       printf("%d %d\n",q.top().first,q.top().second);
       q.pop();
    }
    return 0;
}

//5  输入
//1 9 6 4 8


//9 2  输出
//8 5
//6 3
//4 4
//1 1

 

posted @ 2018-08-27 17:14  ASDIC减除  阅读(90)  评论(0编辑  收藏  举报