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; }

浙公网安备 33010602011771号