poj3268

来源:互联网 发布:apache部署webservice 编辑:程序博客网 时间:2024/05/16 14:42

/*
 * poj3268.cpp
 *
 *  Created on: 2010-8-3
 *      Author: friendy
 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 99999999
using namespace std;
int map[1001][1001];
int used[1001];
int dis1[1001], dis2[1001];
int n;

//dijkstra for the shortest-path
//
void dij1(int u) {
    int i, j, k, min;
    for (i = 1; i <= n; i++)
        dis1[i] = map[u][i];
    used[u] = 1;
    for (i = 1; i < n; i++) {
        min = inf;
        for (j = 1; j <= n; j++) {
            if (!used[j] && dis1[j] < min) {
                min = dis1[j];
                k = j;
            }
        }
        used[k] = 1;
        for (j = 1; j <= n; j++) {
            if (!used[j] && dis1[j] > dis1[k] + map[k][j])
                dis1[j] = dis1[k] + map[k][j];
        }
    }
}
//dijkstra for the shortest-path
//reversed matrix
void dij2(int u) {
    int i, j, k, min;
    for (i = 1; i <= n; i++)
        dis2[i] = map[i][u];
    used[u] = 1;
    for (i = 1; i < n; i++) {
        min = inf;
        for (j = 1; j <= n; j++) {
            if (!used[j] && dis2[j] < min) {
                min = dis2[j];
                k = j;
            }
        }
        used[k] = 1;
        for (j = 1; j <= n; j++) {
            if (!used[j] && dis2[j] > dis2[k] + map[j][k])
                dis2[j] = dis2[k] + map[j][k];
        }
    }
}
int main() {
    int i, j, m, x, a, b, c;
    scanf("%d%d%d", &n, &m, &x);
    //in
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++) {
            if (i == j)
                map[i][j] = 0;
            else
                map[i][j] = inf;
        }
    //create graph
    for (i = 0; i < m; i++) {
        scanf("%d%d%d", &a, &b, &c);
        map[a][b] = c;
    }
    //
    memset(used, 0, sizeof(used));
    dij1(x);
    memset(used, 0, sizeof(used));
    dij2(x);
    int max = 0;
    for (i = 1; i <= n; i++) {//get the bigger of the shortest-path
        if (max < dis1[i] + dis2[i] && i != x)
            max = dis1[i] + dis2[i];
    }
    printf("%d/n", max);
}

原创粉丝点击