最短路 优先队列Dij

#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#define N 100010
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> pii;

struct dat
{
    int u,v,w,next;
} a[N];
int n,m,s,t;
int first[N],done[N],d[N];
void dij()
{
    priority_queue<pii,vector<pii>,greater<pii> >q;
    memset(d, 0x3f, sizeof(d));
    memset(done, 0, sizeof(done));
    d[s]=0;
    q.push(make_pair(d[s],s));
    while(!q.empty())
    {
        pii x;
        x =q.top();
        q.pop();
        int u=x.second;
        if(done[u]) continue;
        done[u]=1;
        for(int i=first[u]; i!=-1; i=a[i].next)
        {
            int v=a[i].v;
            int w=a[i].w;
            if(d[u]+w<d[v])
            {

                d[v]=d[u]+w;
                q.push(make_pair(d[v],v));
            }
        }
    }
}
int main()
{
    int vv,cas=0;
    scanf("%d",&vv);
    while(vv--)
    {
        scanf("%d %d %d %d",&n,&m,&s,&t);
        memset(first, -1, sizeof(first));
        int u,v,w;
        for(int i=0; i<m; i++)
        {
            scanf("%d %d %d",&u,&v,&w);
            a[i*2].u=u;
            a[i*2].v=v;
            a[i*2].w=w;
            a[i*2].next=first[u];
            first[u]=i*2;
            a[i*2+1].u=v;
            a[i*2+1].v=u;
            a[i*2+1].w=w;
            a[i*2+1].next=first[v];
            first[v]=i*2+1;
        }
        dij();
        printf("Case #%d: ",++cas);
        if(d[t]!=INF) printf("%d\n",d[t]);
        else printf("unreachable\n");
    }
    return 0;
}
View Code

 

posted on 2013-09-26 23:43  风流monkey  阅读(135)  评论(0编辑  收藏  举报