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;
}
posted @ 2011-04-21 15:55  L..  阅读(222)  评论(0编辑  收藏  举报