UVa 10986 - Sending email

传送门

UVa 10986 - Sending email

思路

一般的Dijkstra。不过因为n太大了,所以要用邻接链表存。存的时候要记得两边都要存,因为是无向图,这时候就要开两倍的空间。

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int EMAXN = 1e5 + 100;
const int VMAXN = 2e4 + 100;
const int INF = 0x3f3f3f3f;
 
int head[VMAXN], d[VMAXN];
int next[EMAXN], u[EMAXN], v[EMAXN], w[EMAXN];
typedef pair<int, int> pii;
priority_queue<pii, vector<pii>, greater<pii> >q;
 
void Dijkstra(int st)
{
    int i, j;
    for (i = 0; i < VMAXN; i++)
        d[i] = INF;
    d[st] = 0;
    q.push(make_pair(d[st], st));
    while (!q.empty())
    {
        pii u = q.top();
        q.pop();
        int x = u.second;
        if (u.first != d[x])
            continue;
        for (int e = head[x]; e != -1; e = next[e])
        {
            if (d[v[e]] > d[x] + w[e])
            {
                d[v[e]] = d[x] + w[e];
                q.push(make_pair(d[v[e]], v[e]));
            }
        }
    }
}
 
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int T, i, j, a, b, c, m, st, ed, n, cases = 0;
    scanf("%d", &T);
    while (T--)
    {
        int k = 0;
        scanf("%d%d%d%d", &n, &m, &st, &ed);
        memset(head, -1, sizeof head);
        for (i = 0; i < m; i++)
        {
            scanf("%d%d%d", &a, &b, &c);
            u[k] = a, v[k] = b, w[k] = c;
            next[k] = head[u[k]];
            head[u[k]] = k;
            k++;
            u[k] = b, v[k] = a, w[k] = c;
            next[k] = head[u[k]];
            head[u[k]] = k;
            k++;
        }
        Dijkstra(st);
        printf("Case #%d: ", ++cases);
        d[ed] == INF ? printf("unreachable\n") : printf("%d\n", d[ed]);
    }
    return 0;
}

Powered by Jekyll and Theme by solid