80分求调
查看原帖
80分求调
565669
Marrelia楼主2024/7/8 09:05

WA #7和$9

#include <cfloat>
#include <cstring>
#include <iostream>
#include <queue>

const int N = 2e3 + 9, M = 2e5 + 9;

struct Edge {
  int v, nex;
  long double w;
} e[M];
int ecnt, head[N];
long double dis[N];
bool vis[N];

void addEdge(int u, int v, int w) {
  e[++ecnt].v = v;
  e[ecnt].nex = head[u];
  e[ecnt].w = w * 1.0;
  head[u] = ecnt;
}

void dijkstra(int U) {
  dis[U] = 0.0;
  std::priority_queue<std::pair<long double, int>,
                      std::vector<std::pair<long double, int>>, std::greater<>>
      Q;
  Q.push({0.0, U});
  while (!Q.empty()) {
    long double Dis = Q.top().first;
    int u = Q.top().second;
    Q.pop();
    if (vis[u]) continue;
    vis[u] = true;
    for (int i = head[u]; i; i = e[i].nex) {
      int v = e[i].v;
      long double w = e[i].w;
      if (!vis[v] && dis[v] > w + Dis - Dis * w / 100.0) {
        dis[v] = w + Dis - Dis * w / 100.0;
        Q.push({dis[v], v});
      }
    }
  }
}

int main() {
  std::fill_n(dis, 2000, LDBL_MAX);
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    addEdge(u, v, w);
    addEdge(v, u, w);
  }
  int A, B;
  scanf("%d%d", &A, &B);
  dijkstra(A);
  printf("%.8Lf\n", 100.0 / (1.0 - dis[B] / 100.0));
  return 0;
}
2024/7/8 09:05
加载中...