zoukankan      html  css  js  c++  java
  • 最小环

    题目描述

    • 旅游区可以表示为一张由(n)个节点 (m)条边组成无向图。我故地重游,却发现自己只想尽快地结束这次旅游。
    • 我从景区的出发点(即(1)号节点)出发,却只想找出最短的一条回路重新回到出发点,并且中途不重复经过任意一条边。即:我想找出从出发点到出发点的小环。

    输入格式

    • 每个测试点有多组测试数据。
    • 第一行有一个正整数 T, (T≤ 10) 表示数据组数。
    • 接下来对于每组数据,第一行有两个正整数 n,m, (nle 10^4,m ≤4 imes 10^4 ) 分别代表图的点数和边数。
    • 接下来有 m 行,每行三个整数 u,v,d 表示 u,v 之间存在一条长度为 d, (d ≤ 10^3) 的路径。
    • 保证不存在重边,自环。

    输出格式

    • 对于每组测试数据,输出题目中所求的最小环的长度。
    • 无解输出(-1)

    样例

    样例输入

    2
    3 3
    1 2 1
    2 3 1
    3 1 1
    4 5
    1 2 2
    2 3 2
    3 4 2
    1 4 2
    1 3 5
    

    样例输出

    3
    8
    

    code

    /*
    2
    3 3
    1 2 1
    2 3 1
    3 1 1
    4 5
    1 2 2
    2 3 2
    3 4 2
    1 4 2
    1 3 5
    */
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e4 + 5, maxm = 4e4 + 5;
    const int Inf = 0x3f3f3f3f;
    struct node {
        int to, next, val;
    } e[maxm << 1];
    int head[maxn], len;
    int vis[maxn], dis[maxn];
    void add(int a, int b, int c) {
        e[len] = (node){ b, head[a], c };
        head[a] = len++;
    }
    void Spfa(int x) {
        memset(dis, 0x3f, sizeof(dis));
        memset(vis, 0, sizeof(vis));
        queue<int> q;
        q.push(x);
        dis[x] = 0;
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            vis[u] = 0;
            for (int i = head[u]; ~i; i = e[i].next) {
                int v = e[i].to;
                if (dis[v] > dis[u] + e[i].val) {
                    dis[v] = dis[u] + e[i].val;
                    if (!vis[v])
                        q.push(v), vis[v] = 1;
                }
            }
        }
    }
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            int n, m;
            cin >> n >> m;
            memset(head, -1, sizeof(head));
            len = 0;
            for (int i = 1; i <= m; i++) {
                int u, v, val;
                cin >> u >> v >> val;
                add(u, v, val);
                add(v, u, val);
            }
            int ans = Inf;
            for (int i = head[1]; ~i; i = e[i].next) {
                int temp = e[i].val;
                e[i].val = e[i ^ 1].val = Inf;
                Spfa(1);
                ans = std::min(ans, dis[e[i].to] + temp);
                e[i].val = e[i ^ 1].val = temp;
            }
            if (ans == Inf)
                ans = -1;
            cout << ans << endl;
        }
    }
    
  • 相关阅读:
    计算与软件工程作业一
    《CLSZS团队》:团队项目选题报告
    计算与软件工程第五次作业
    计算与软件工程第四次作业
    计算与软件工程代码规范
    计算与软件工程第三次作业
    计算与软件工程第二次作业
    壹贰叁肆团队项目选题报告
    计算与软件工程 作业五
    计算与软件工程 作业四
  • 原文地址:https://www.cnblogs.com/hellohhy/p/13269038.html
Copyright © 2011-2022 走看看