Pagini recente » Cod sursa (job #2157361) | Cod sursa (job #2815701) | Cod sursa (job #2626771) | Cod sursa (job #2939446) | Cod sursa (job #3271979)
#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;
}