ZOJ 1655 Transport Goods

最短路问题    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;
}



你可能感兴趣的:(ZOJ 1655 Transport Goods)