1 条题解

  • 0
    @ 2025-9-10 8:58:59

    C++ :

    #include <stdio.h>
    #include <string.h>
    
    #include <vector>
    #include <queue>
    
    typedef std::pair<int, int> pii;
    typedef long long llong;
    const int N = 10000 + 5;
    const int INF = 0x3f3f3f3f;
    
    std::vector<pii> g[N];
    bool vis[N];
    
    void spfa(int s, int d[N])
    {
      std::queue <int> q;
      memset(d, 0x3f, sizeof(int) * N);
      memset(vis, 0, sizeof(bool) * N);
      q.push(s); vis[s] = true; d[s] = 0;
      for (; !q.empty(); )
      {
        int u = q.front(); q.pop();  vis[u] = false;
        for (int i = 0; i < g[u].size(); ++i)
        {
          int v = g[u][i].first;
          int c = g[u][i].second;
          if (d[u] + c < d[v])
          {
            d[v] = d[u] + c;
            if (!vis[v])
            {
              vis[v] = true;
              q.push(v);
            }
          }
        }
      }
    }
    
    int da[N];
    int db[N];
    int dc[N];
    
    int main()
    {
      int casc;
      scanf("%d", &casc);
      for (int casi = 1; casi <= casc; ++casi) {
        int n, m;
        scanf("%d %d", &n, &m);
        for (int i = 1; i <= n; ++i)
          g[i].clear();
        int a, b, c;
        for (; m--; ) {
          scanf("%d %d %d", &a, &b, &c);
          g[a].push_back(pii(b, c));
          g[b].push_back(pii(a, c));
        }
        scanf("%d %d %d", &a, &b, &c);
        spfa(a, da); spfa(b, db); spfa(c, dc);
        llong result = 0LL + da[b] + db[c] + dc[a];
        for (int i = 1; i <= n; ++i) {
          result = std::min(result, 0LL + da[i] + db[i] + dc[i]);
        }
        if (result >= INF)
          result = -1;
        printf("%d\n", (int) result);
      }
      return 0;
    }
    
    
    • 1

    信息

    ID
    3507
    时间
    2000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者