映射二元堆積+Dijkstra

來源:互聯網
上載者:User

幽幽子


[html]
#include <cstdio> 
#include <cstring> 
#define N 100010 
#define M 400010 
#define INF 999999999 
int n,m,s,a,b; 
int head[N],cnt; 
struct Edge 

    int v,next,w; 
}edge[M]; 
struct Heap 

    int d,v,p; 
}heap[N]; 
int hl,pos[N]; 
void addedge(int u,int v,int w) 

    edge[cnt].next=head[u]; edge[cnt].v=v; edge[cnt].w=w; 
    head[u]=cnt++; 

void swap(int a,int b) 

    heap[0]=heap[a];    heap[a]=heap[b];    heap[b]=heap[0]; 
    pos[heap[a].v]=a;    pos[heap[b].v]=b; 

void heapfy() 

    int i=2; 
    while (i<=hl) 
    { 
        if(i+1<=hl && heap[i+1].d<heap[i].d)i++; 
        if(heap[i].d<heap[i>>1].d) 
        { 
            swap(i,i>>1); 
            i<<=1;; 
        } 
        else break; 
    } 

void decrease(int i) 

    while (i!=1 && heap[i].d<heap[i>>1].d) 
    { 
        swap(i,i>>1); i>>=1; 
    } 

void relax(int u,int v,int w) 

    if(heap[pos[u]].d+w<heap[pos[v]].d) 
    { 
        heap[pos[v]].d=heap[pos[u]].d+w; 
        decrease(pos[v]); 
    } 

void dijkstra(int s,int n) 

    int u,i; 
    for(i=1;i<=n;i++) 
    { 
        heap[i].v=pos[i]=i;    heap[i].d=INF; 
    } 
    heap[s].p=s;    heap[s].d=0;    swap(1,s);    hl=n; 
    while (hl) 
    { 
        u=heap[1].v; 
        swap(1,hl); 
        hl--; 
        heapfy(); 
        for(i=head[u];i!=-1;i=edge[i].next) 
            if(pos[edge[i].v]<=hl) relax(u,edge[i].v,edge[i].w); 
    } 

int main () 

    int ds1,ds2,dab; 
    while (scanf("%d%d%d%d%d",&m,&n,&s,&a,&b)!=-1) 
    { 
        cnt=0; 
        memset(head,-1,sizeof(head)); 
        while (m--) 
        { 
            int u,v,w; 
            scanf("%d%d%d",&u,&v,&w); 
            addedge(u,v,w); 
            addedge(v,u,w); 
        } 
        dijkstra(s,n); 
        ds1=heap[pos[a]].d; 
        ds2=heap[pos[b]].d; 
        dijkstra(a,n); 
        dab=heap[pos[b]].d; 
        printf("%d\n",dab+(ds1<ds2?ds1:ds2)); 
    } 
     
    return 0; 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.