Cod sursa(job #3271979)

Utilizator danielbirsannBirsan Daniel danielbirsann Data 28 ianuarie 2025 00:51:21
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

struct Edge
{
    int u, v, weight;
    bool operator<(const Edge &other) const
    {
        return weight < other.weight;
    }
};

struct DSU
{
    vector<int> parent, rank;
    DSU(int n)
    {
        parent.resize(n);
        rank.resize(n, 0);
        for (int i = 0; i < n; ++i)
            parent[i] = i;
    }
    int find(int x)
    {
        if (parent[x] != x)
            parent[x] = find(parent[x]);
        return parent[x];
    }
    bool unite(int x, int y)
    {
        x = find(x);
        y = find(y);
        if (x == y)
            return false;
        if (rank[x] < rank[y])
            swap(x, y);
        parent[y] = x;
        if (rank[x] == rank[y])
            ++rank[x];
        return true;
    }
};

int main()
{
    int n, m;
    cin >> n >> m;
    vector<Edge> edges(m);
    for (int i = 0; i < m; ++i)
    {
        cin >> edges[i].u >> edges[i].v;
        edges[i].weight = 1;
    }

    sort(edges.begin(), edges.end());

    DSU dsu1(n + 1);
    vector<Edge> tree1, tree2;
    for (const auto &edge : edges)
    {
        if (dsu1.unite(edge.u, edge.v))
        {
            tree1.push_back(edge);
            if (tree1.size() == n - 1)
                break;
        }
    }

    if (tree1.size() != n - 1)
    {
        cout << "Nu" << endl;
        return 0;
    }

    for (const auto &edgeToExclude : tree1)
    {
        DSU dsu2(n + 1);
        vector<Edge> tempTree;
        for (const auto &edge : edges)
        {
            if (edge.u == edgeToExclude.u && edge.v == edgeToExclude.v)
                continue;
            if (dsu2.unite(edge.u, edge.v))
            {
                tempTree.push_back(edge);
                if (tempTree.size() == n - 1)
                    break;
            }
        }
        if (tempTree.size() == n - 1)
        {
            tree2 = tempTree;
            break;
        }
    }

    if (tree2.empty())
    {
        cout << "Nu" << endl;
    }
    else
    {
        cout << "Da" << endl;
        for (const auto &edge : tree1)
        {
            cout << edge.u << " " << edge.v << endl;
        }
        for (const auto &edge : tree2)
        {
            cout << edge.u << " " << edge.v << endl;
        }
    }

    return 0;
}