1 条题解

  • 0
    @ 2023-1-17 16:44:39

    因为这题的特殊性质,用spfa跑多源最短路就最合适了。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 800;
    const int MAXM = 1450;
    int cnt, pos[505]; // 奶牛数,奶牛位置
    int n, m, s;
    struct Edge
    {
        int v, w;
    };
    vector<Edge> e[MAXN + 5];
    int dis[MAXN + 5];  // dis[i]: s->i 的最短路
    bool vis[MAXN + 5]; // vis[i]: i号点在不在队列里
    queue<int> q;       // 存储被优化过的点(尝试用它们作为起点的边优化边的终点)
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        // 输入
        cin >> cnt >> n >> m;
        for (int i = 1; i <= cnt; i++)
            cin >> pos[i];
        for (int i = 1; i <= m; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u].push_back((Edge){v, w});
            e[v].push_back((Edge){u, w});
        }
        // SPFA
        int ans = 0x3f3f3f3f;
        for (int s = 1; s <= n; s++)
        {
            memset(dis, 0x3f, sizeof(dis));
            memset(vis, false, sizeof(vis));
            dis[s] = 0;
            q.push(s);
            vis[s] = true;
            while (!q.empty())
            {
                int u = q.front();
                q.pop();
                vis[u] = false; // u点现在不在队列里了
                for (int i = 0; i < e[u].size(); i++)
                {
                    int v = e[u][i].v;
                    int w = e[u][i].w;
                    if (dis[u] + w < dis[v])
                    {
                        dis[v] = dis[u] + w;
                        if (vis[v] == false)
                        {
                            q.push(v);
                            vis[v] = true;
                        }
                    }
                }
            }
            int now = 0;
            bool flag = true;
            for (int i = 1; i <= cnt; i++)
            {
                if (dis[pos[i]] == 0x3f3f3f3f)
                {
                    flag = false;
                    break;
                }
                now += dis[pos[i]];
            }
            if (flag)
                ans = min(ans, now);
        }
        // 输出
        cout << ans << "\n";
        return 0;
    }
    
    
    • 1

    信息

    ID
    564
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    (无)
    递交数
    33
    已通过
    15
    上传者