您的位置:首页 > 其它

HDU 2544(Floyd、Dijkstra、Bellman-Ford、SPFA)

2015-07-27 12:00 417 查看
中文题

[code]#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 110
#define M 10010
#define INF 0x3f3f3f3f
using namespace std;
struct edgs{
    int u, v, dis;
}Edgs[M];

int dis

, d
, vis
;
int u[M], v[M], head[M], Next[M], len[M];
int n, m, cnt;

void add_edgs(int s, int e, int l) {
    u[cnt] = s;
    v[cnt] = e;
    len[cnt] = l;
    Next[cnt] = head[s];
    head[s] = cnt++;
}

void init() {
    memset(dis, 0x3f, sizeof(dis));
    memset(head, -1, sizeof(head));
    cnt = 0;

    cnt = 0;
    int x, y, z;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &x, &y, &z);
        dis[x][y] = dis[y][x] = min(dis[x][y], z);
        Edgs[i].u = x;
        Edgs[i].v = y;
        Edgs[i].dis = min(dis[x][y], z);
        add_edgs(x, y, min(dis[x][y], z));
        add_edgs(y, x, min(dis[x][y], z));
    }
}

int Dijkstra() {

    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++)
        d[i] = INF;
    d[1] = 0;
    for (int i = 0; i < n; i++) {
        int x, t = INF;
        for (int j = 1; j <= m; j++)
            if (!vis[j] && d[j] < t) {
                x = j;
                t = d[j];
            }
        vis[x] = 1;

        for (int j = 1; j <= n; j++)
            d[j] = min(d[j], d[x] + dis[x][j]);
    }
    return d
;
}

int Floyd() {
    for (int i = 1; i <= n; i++)
        dis[i][i] = 0;

    for (int k = 1; k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (dis[i][k] != INF && dis[k][j] != INF && dis[i][j] > dis[i][k] + dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];

    return dis[1]
;
}

int Bellman_Ford() {

    for (int i = 2; i <= n; i++)
        d[i] = INF;
    d[1] = 0;

    for (int i = 1; i <= n - 1; i++) 
        for (int j = 0; j < m; j++) {
            int u = Edgs[j].u;
            int v = Edgs[j].v;
            if (d[u] < INF)
                d[v] = min(d[v], d[u] + Edgs[j].dis);
            if (d[v] < INF)
                d[u] = min(d[u], d[v] + Edgs[j].dis);
        }  
    return d
;
}

int SPFA() {
    memset(vis, 0, sizeof(vis));
    for (int i = 2; i <= n; i++)
        d[i] = INF;
    d[1] = 0;
    queue<int> q;
    q.push(1);

    while (!q.empty()) {    
        int t = q.front();
        q.pop();
        vis[t] = 0;
        for (int i = head[t]; i != -1; i = Next[i]) {
            if (d[v[i]] > d[u[i]] + len[i]) {
                d[v[i]] = d[u[i]] + len[i];
                if (!vis[v[i]]) {
                    q.push(v[i]);
                    vis[v[i]] = 1;
                }   
            }
        }
    }
    return d
;    
}

int main() {
    while (scanf("%d%d", &n, &m) != EOF && n + m) {
        init();
//      printf("%d\n", Dijkstra());
//      printf("%d\n", Floyd());
//      printf("%d\n", Bellman_Ford());
        printf("%d\n", SPFA());
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: