您的位置:首页 > 其它

POJ 3268 Silver Cow Party

2011-04-21 15:55 316 查看
题意

一只母牛从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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: