/*
* 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);
}
poj3268
最新推荐文章于 2021-09-30 21:06:39 发布