uva10986

题目链接请戳 这里

 

解题思路

用Dijkstra和SPFA算法解决。

这次还是SPFA快,快了10ms

 

代码

首先是Dijkstra的

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define M 100010
#define N 20010
#define INF 1e9
using namespace std;

typedef pair<int, int> pii;
int v[M], u[M], w[M], first[N], nex[M];
priority_queue <pii, vector<pii>, greater<pii> > q;
int n, m, s, t, edge_num;
int d[N];

void addedge(int x, int y, int z)
{
    int &e = edge_num;
    u[e] = x; v[e] = y; w[e] = z;
    nex[e] = first[u[e]];
    first[u[e]] = e;
    e++;
    u[e] = y; v[e] = x; w[e] = z;
    nex[e] = first[u[e]];
    first[u[e]] = e;
    e++;
}

int Dijkstra(int a, int b)
{
    for (int i = 0; i < n; i++) d[i] = (i == a) ? 0 : INF;
    q.push(make_pair(d[a], a));
    while (!q.empty()) {
        pii u = q.top(); q.pop();
        int x = u.second;
        if (d[x] != u.first) continue;
        for (int e = first[x]; e != -1; e = nex[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]));
        }
    }
    return d[b];
}

int main()
{
    int tests;
    int d = 0;
    scanf("%d", &tests);
    while (tests--) {
        d++;
        edge_num = 0;
        memset(first, -1, sizeof(first));
        scanf("%d%d%d%d", &n, &m, &s, &t);
        for (int i = 0; i < m; i++) {
            int x, y, z;
            scanf("%d%d%d", &x, &y, &z);
            addedge(x, y, z);
        }
        printf("Case #%d: ", d);
        int ans = Dijkstra(s, t);
        if (ans == INF) printf("unreachable\n");
        else printf("%d\n", ans);
    }
    return 0;
}

 

然后是SPFA的代码

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define M 100010
#define N 20010
#define INF 1e9
using namespace std;

int v[M], u[M], w[M], first[N], nex[M];
queue <int> q;
int n, m, s, t, edge_num;
int d[N], inq[N];

void addedge(int x, int y, int z)
{
    int &e = edge_num;
    u[e] = x; v[e] = y; w[e] = z;
    nex[e] = first[u[e]];
    first[u[e]] = e;
    e++;
    u[e] = y; v[e] = x; w[e] = z;
    nex[e] = first[u[e]];
    first[u[e]] = e;
    e++;
}

int SPFA(int a, int b)
{
    for (int i = 0; i < n; i++) d[i] = (i == a) ? 0 : INF;
    memset(inq, 0, sizeof(inq));
    q.push(a); inq[a] = true;
    while (!q.empty()) {
        int x = q.front(); q.pop();
        inq[x] = false;
        for (int e = first[x]; e != -1; e = nex[e]) if (d[v[e]] > d[x] + w[e]) {
            d[v[e]] = d[x] + w[e];
            if (!inq[v[e]]) {
                inq[v[e]] = true;
                q.push(v[e]);
            }
        }
    }
    return d[b];
}

int main()
{
    int tests;
    int d = 0;
    scanf("%d", &tests);
    while (tests--) {
        d++;
        edge_num = 0;
        memset(first, -1, sizeof(first));
        scanf("%d%d%d%d", &n, &m, &s, &t);
        for (int i = 0; i < m; i++) {
            int x, y, z;
            scanf("%d%d%d", &x, &y, &z);
            addedge(x, y, z);
        }
        printf("Case #%d: ", d);
        int ans = SPFA(s, t);
        if (ans == INF) printf("unreachable\n");
        else printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2016-11-08 22:50  啊嘞  阅读(272)  评论(0编辑  收藏  举报