POJ 3268 Silver Cow Party
题意
一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。 每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。 求每头牛要来回的最短时间。
思路:正着求一次最短路径,矩阵转置,再求一次最短路径,想加求最大
#include <iostream>
#include <string.h>
using namespace std;
const int MAXN =1001;
int n,m,x;
const int INF = 0x7FFF;
int G[MAXN][MAXN];
int dist1[MAXN];
int sum[MAXN];
bool used[MAXN];
void in(){
int i,j,from,to,t;
cin >> n >> m >> x;
for(i = 1; i <= n;i++){
for(j = 1; j <= n; j++){
if(i != j){
G[i][j] = INF;
} else {
G[i][j] = 0;
}
}
}
for(i = 1; i <= m;i++){
cin >> from >> to >> t;
G[from][to] = t;
}
memset(sum,0,sizeof(sum));
}
void dijkstra(){
int i,j;
for(i = 1; i <= n;i++){
dist1[i] = G[x][i];
used[i] = false;
}
used[x] = true;
dist1[x] = 0;
for(i = 1; i < n; i++){
int min = INF,minIndex = x;
for(j = 1; j <= n; j++)
if(!used[j] && dist1[j] < min){
min = dist1[j];
minIndex = j;
}
used[minIndex] = true;
sum[minIndex] += dist1[minIndex];
for(j = 1; j <= n; j++){
if(!used[j] && dist1[j] > dist1[minIndex]+G[minIndex][j]){
dist1[j] = dist1[minIndex]+G[minIndex][j];
}
}
}
}
void reverse(){
int i,j,temp;
for(i = 1; i <= n; i++){
for(j = 1; j < i; j++){
temp = G[i][j];
G[i][j] = G[j][i];
G[j][i] = temp;
}
}
}
int main(){
int max = 0,i;
in();
dijkstra();
reverse();
dijkstra();
for(i = 1; i <= n; i++)
if(max < sum[i])
max = sum[i];
cout << max << endl;
return 0;
}