Dijstra

来源:互联网 发布:linux vim命令模式 编辑:程序博客网 时间:2024/06/11 13:57

优先队列版本

#include<cstdio>#include<cstring>#include<queue>#include<vector>#include<algorithm>using namespace std;int n,m,fir[100001],dis[100001],now,loc[100001],g[100001];struct node{    int w,t,nxt;}l[6000001];bool cmp(const pair<int,int>a,const pair<int,int>b){    return a.first<b.first;//}priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;pair<int,int>Now;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&now,&l[i].t,&l[i].w);        l[i].nxt=fir[now];        fir[now]=i;        l[m+i].w=l[i].w,l[m+i].t=now;        l[m+i].nxt=fir[l[i].t];fir[l[i].t]=m+i;    }    memset(dis,127,sizeof dis);dis[1]=0;    q.push(make_pair(0,1));    for(int i=2;i<=n;i++){        loc[i]=i;        q.push(make_pair(1<<30,i));    }    for(int i=1;i<=n;i++){        while(g[q.top().second]) q.pop();        g[q.top().second]=1;        Now=q.top();        for(int j=fir[Now.second];j;j=l[j].nxt)            if(dis[l[j].t]>Now.first+l[j].w){                dis[l[j].t]=Now.first+l[j].w;                q.push(make_pair(dis[l[j].t],l[j].t));            }        q.pop();    }    printf("%d",dis[n]);}

堆优化版本(更快)

#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#define maxn 100005using namespace std;int n,m,dis[maxn],s,t;bool vis[maxn],in[maxn];int heap[maxn],pos[maxn],size;struct node{    int to,cst,nxt;}e[6000005];int cnt_e,fir[100005];void get(int &res){    res=0;    char ch;    while(!isdigit(ch=getchar()));    for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0');}void Node(int u,int v,int cst){    e[++cnt_e].nxt=fir[u];    e[cnt_e].to=v;    e[cnt_e].cst=cst;    fir[u]=cnt_e;}void swap(int a,int b){    heap[a]^=heap[b],heap[b]^=heap[a],heap[a]^=heap[b];    pos[heap[a]]=a;    pos[heap[b]]=b;}void shift(int now){    while(now>1){        if(dis[heap[now]]<dis[heap[now>>1]]){            swap(now,now>>1);            now>>=1;        }        else return;    }}void put(int id){    heap[++size]=id;    pos[id]=size;    shift(size);}int get(){    int tmp=heap[1],now=1,nxt;    heap[1]=heap[size--],pos[heap[1]]=1;    while(now<<1<=size){        nxt=now<<1;        if(nxt+1<=size && dis[heap[nxt]]>dis[heap[nxt+1]]) nxt++;        if(dis[heap[nxt]]>dis[heap[now]]) return tmp;        swap(now,nxt);        now=nxt;    }    return tmp;}int main(){    int u,v,w;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        get(u);get(v);get(w);        Node(u,v,w);        Node(v,u,w);    }    int Maxloc;    memset(dis,127/3,sizeof dis);    dis[1]=0;    for(int i=1;i<=n;i++) put(i);    for(int i=1;i<n;i++){        Maxloc=get();        for(int j=fir[Maxloc];j;j=e[j].nxt)            if(dis[e[j].to]>dis[Maxloc]+e[j].cst){                dis[e[j].to]=dis[Maxloc]+e[j].cst;                shift(pos[e[j].to]);            }    }    printf("%d",dis[n]);}