最短路问题 Dijkstra
分析:
1)要使运输到第n个城市的重量最大,每个城市的货物重量与每一条路的费用率有关,每个边的权值就是费用率,所以我们只需求出每个城市到首都的最优路线就行。用Dij的话,就是单源最短路径,即求出从首都出发,到各城市的最优路线。所以起始点是n。
2)最优路线就是累计费用率c最大的路线,c的初始值是1 。所以每加上一条边,就乘以这条边的剩余费用率(1-c)。
3)最后把所有城市的最大运输值求和。
AC代码:
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 110
int n,m;
int s[MAXN],cost[MAXN];
double map[MAXN][MAXN], dist[MAXN];
double Dijkstra() {
int i,j;
double sum = 0;
memset(s, 0, sizeof(s));
memset(dist, 0, sizeof(dist));
for(i=1; i<n; i++)
dist[i] = map[i][n];
s[n] = 1;
dist[n] = 0;
for(i=1; i<n; i++) {
double max = 0.0;
int u;
for(j=1; j<=n; j++) {
if(!s[j] && max<=dist[j]) {
max = dist[j];
u = j;
}
}
sum += max*(double)cost[u];
s[u] = 1;
for(j=1; j<=n; j++) {
if(!s[j] && dist[u]*map[j][u]>dist[j])
dist[j] = dist[u] * map[j][u];
}
}
return sum;
}
int main() {
int i;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=1; i<n; i++)
scanf("%d", &cost[i]);
memset(map, 0.0, sizeof(map));
for(i=0; i<m; i++) {
int a,b;
double c;
scanf("%d%d%lf", &a,&b,&c);
if(map[a][b]<(1.0-c) || map[a][b]==0.0)
map[a][b] = map[b][a] = 1.0-c;
}
/*
double ans;
for(i=1; i<n; i++)
ans += map[n][i]*cost[i];
printf("%.2lf\n", ans);
*/
printf("%.2lf\n", Dijkstra());
}
return 0;
}