Pagini recente » Cod sursa (job #541669) | Cod sursa (job #3181749) | Cod sursa (job #1435464) | Cod sursa (job #1452942) | Cod sursa (job #2483417)
#include <bits/stdc++.h>
#define x first
#define y second
#define pb push_back
using namespace std;
ifstream in("party.in");
ofstream out("party.out");
bool wrong[105];
bool T[105][105];
vector < int > E[105];
vector < pair < int, int > > a;
vector < int > V[105];
set < int > s;
bool viz[105];
void kill(int eliminatul) {
viz[eliminatul] = 1;
wrong[eliminatul] = true;
for (auto it : E[eliminatul]) {
if (!viz[it]) {
kill(it);
}
}
}
void extract_length(int node, int &x) {
if (!wrong[node]) x++;
viz[node] = 1;
for (auto it : E[node]) {
if (!viz[it]) {
extract_length(it, x);
}
}
}
int main() {
int n, m;
in >> n >> m;
while(m--) {
int x, y, op;
in >> x >> y >> op;
if (op == 1) {
E[x].pb(y);
T[x][y] = 1;
}
else if (op == 2) {
E[y].pb(x);
T[y][x] = 1;
}
else if (op == 3) {
a.pb({x, y});
}
else {
V[x].pb(y);
V[y].pb(x);
}
}
for (int i = 1; i <= n; i++) {
s.insert(i);
}
for (auto it : a) {
if (!wrong[it.x] && wrong[it.y]) {
s.erase(it.y);
}
else if (wrong[it.x] && !wrong[it.y]) {
s.erase(it.x);
}
else if (!wrong[it.x] && !wrong[it.y]) {
bool ok = false, ok1 = false;
for (auto it1 : V[it.x]) {
if (T[it.x][it1]) {
ok = true;
break;
}
}
for (auto it1 : V[it.y]) {
if (T[it.y][it1]) {
ok = true;
break;
}
}
int eliminatul;
if (ok && !ok1) eliminatul = it.x;
else if (!ok && ok1) eliminatul = it.y;
else {
int x = 0, y = 0;
memset(viz, 0, sizeof(viz));
extract_length(it.x, x);
extract_length(it.y, y);
cout << x << " " << y << "\n";
if (x < y) eliminatul = it.x;
else eliminatul = it.y;
}
memset(viz, 0, sizeof(viz));
kill(eliminatul);
s.erase(eliminatul);
}
}
out << s.size() << "\n";
for (auto it : s) {
out << it << "\n";
}
return 0;
}