FZU1125 dijkstra

首先构造成一个图,每个城市往王国运送物资肯定走费用最少的那条路,这就转化成了求最长路问题。

#define maxn 501
int n, m;
int w[maxn];
double dist[maxn];
int s[maxn];
double Edge[maxn][maxn];
void dijkstra(int v0)
{
    int i, j, k;
    for (i = 0; i < n; i++)
    {
        dist[i] = Edge[v0][i];
        s[i] = 0;
    }
    s[v0] = 1;
    dist[v0] = 1;
    for (i = 0; i < n - 1; i++)
    {
        double min1 = -1;
        int u = n-1;
        for (j = 0; j < n; j++)
        {
            if (dist[j]>min1 && !s[j])
            {
                u = j;
                min1 = dist[j];
            }
        }
        s[u] = 1;
        for (k = 0; k < n; k++)
        {
            if (dist[u] * Edge[u][k]>dist[k] && !s[k] && Edge[u][k] != 0)
                dist[k] = dist[u] * Edge[u][k];
        }
    }
    double sum = 0;
    for (i = 0; i < n; i++)
    {
        sum += dist[i] * w[i];
    }
    printf("%.2lf\n", sum);
}
int main()
{
    int i, j, k, x, y;
    double r;
    while (scanf("%d%d", &n, &m) != EOF)
    {
        for (i = 0; i < n - 1; i++)
        {
            scanf("%d", &w[i]);
        }
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                Edge[i][j] = 0;
            }
        }
        for (i = 0; i < m; i++)
        {
            scanf("%d%d%lf", &x, &y, &r);
            x--;
            y--;
            if (Edge[x][y] < (1 - r))
                Edge[x][y] = Edge[y][x] = (1 - r);
        }
        dijkstra(n - 1);
    }
    return 0;
}

 

posted @ 2016-10-05 19:22  web之路  阅读(86)  评论(0)    收藏  举报