uva 10986

ford 超时  使用优先队列的Dijkstra 算法

//#include <cstdio>
//#include <cstring>
//#include <algorithm>
//#define INF 500000000
//using namespace std;
//int a[20010][20010];
//int main()
//{
//    int t, ca = 1;
//    scanf("%d",&t);
//    while(t--)
//    {
//        int n,m,s,v;
//        scanf("%d%d%d%d",&n,&m,&s,&v);
//        for(int i = 0; i <= n; i++)
//            for(int j = 0; j <= n; j++)
//            {
//                if(i == j)
//                    a[i][j] = 0;
//                else
//                    a[i][j] = INF;
//            }
//        for(int i = 0; i < m; i++)
//        {
//            int x,y,w;
//            scanf("%d%d%d",&x,&y,&w);
//            a[x][y] = a[y][x] = w;
//        }
//        for(int k = 0; k < n; k++)
//            for(int i = 0; i < n; i++)
//                for(int j = 0; j < n; j++)
//                {
//                    a[i][j] = min(a[i][j], a[i][k]+a[k][j]);
//                }
//        if(a[s][v] < INF)
//            printf("Case #%d: %d\n",ca++,a[s][v]);
//        else
//            printf("Case #%d: unreachable\n",ca++);
//    }
//    return 0;
//}
#include <cstdio>
#include <cstring>
#include <queue>

#define N 20005
#define M 100005
#define INF 1<<28

struct node
{
    int id, dd;
    node(int i, int j)
    {
        id = i;
        dd = j;
    }
    bool operator < (const node &it) const
    {
        return dd > it.dd;
    }
};

int first[M],v[M],w[M],next[M],dis[N],vis[N];

int Dijkstra(int st, int ed, int n)
{
    for(int i = 0; i < n; i++)
    {
        vis[i] = 0;
        dis[i] = INF;
    }
    dis[st] = 0;
    std::priority_queue<node> Q;
    Q.push(node(st, 0));
    while(!Q.empty())
    {
        node t = Q.top();
        Q.pop();
        if(vis[t.id]) continue;
        if(t.id == ed)
            return t.dd;
        vis[t.id] = 1;
        for(int e = first[t.id]; e != -1; e = next[e])
        {
            if(dis[v[e]] > dis[t.id] + w[e])
            {
                dis[v[e]] = dis[t.id] + w[e];
                Q.push(node(v[e], dis[v[e]]));
            }
        }
    }
    return INF;
}

int main()
{
    int ca = 1;
    int t;
    scanf("%d", &t);
    while(t--)
    {
        int n,m,s,d;
        scanf("%d%d%d%d", &n, &m, &s, &d);
        memset(first, -1, sizeof(first));
        int l = 0;
        for(int i = 0; i < m; i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            next[l] = first[a];
            v[l] = b;
            w[l] = c;
            first[a] = l++;
            next[l]=first[b];
            v[l] = a;
            w[l] = c;
            first[b] = l++;
        }
        int ans = Dijkstra(s, d, n);
        printf("Case #%d: ", ca++);
        if(ans == INF)
            puts("unreachable");
        else
            printf("%d\n", ans);
    }
    return 0;
}


转载于:https://www.cnblogs.com/avema/p/3774287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值