一本通1531:John‘s Trip

这篇文章展示了如何使用C++实现一个算法,通过深度优先搜索找出给定图中的回路。它处理输入的边并判断是否存在回路,如果存在则输出每个回路的长度。
#include <bits/stdc++.h>

using namespace std;


constexpr int MAXN = 1e2 + 10, MAXM = 2e3 + 10;
vector<pair<int, int>> g[MAXN];

int vis[MAXM];
int n, m;
int deg[MAXN];
bool flag = false;
int seq[MAXM];
int top;
int r;

void dfs(int u, int cnt) {
    for (auto e : g[u]) {
        int id = e.first, v = e.second;

        if (vis[id])
            continue;

        vis[id] = 1;
        dfs(v, id);
    }

    if (cnt)
        seq[++top] = cnt;
}
void solve() {
    int x, y, id;

    while (cin >> x >> y && x) {
        ++m;
        cin >> id;
        g[x].push_back({id, y});
        g[y].push_back({id, x});
        n = max({n, x, y});
        deg[x]++;
        deg[y]++;
    }

    for (int i = 1; i <= n; ++i) {
        sort(g[i].begin(), g[i].end());

        if (deg[i] % 2) {
            cout << "Round trip does not exist.\n";
            return;
        }
    }

    flag = false;
    top = 0;
    dfs(r, 0);
    reverse(seq + 1, seq + 1 + m);

    for (int i = 1; i <= m; ++i)
        cout << seq[i] << " \n"[i == m];

    //  cout<<'\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int x, y;

    while (cin >> x >> y && x) {
        r = min(x, y);

        for (int i = 1; i <= n; ++i)
            g[i].clear();

        memset(vis, 0, sizeof vis);
        memset(deg, 0, sizeof deg);
        n = 0;
        m = 1;
        int id;
        cin >> id;
        deg[x]++;
        deg[y]++;
        g[x].push_back({id, y});
        g[y].push_back({id, x});
        n = max(x, y);
        solve();
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值