#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int M = 3 * N + 1000;
vector<pair<int, int>> graf[N], kraw;
set<int> miny[N], maxy[N];
int licznik = N;
vector<int> dwu[M];
unordered_map<int, int> mapa;
vector<int> odz(M, -1);
void dfs(int v, int ojc){
for(auto k : graf[v]){
int u = k.first;
int ind = k.second;
if(u != ojc){
dfs(u, v);
if(!miny[u].empty()){
int a = *miny[u].rbegin();
if(mapa.find(a) != mapa.end()){
int tmp = mapa[a];
dwu[tmp].push_back(ind);
dwu[ind].push_back(tmp);
}else{
mapa[a] = licznik;
odz[licznik] = a;
dwu[ind].push_back(licznik);
dwu[licznik].push_back(ind);
licznik++;
}
// cout << u << " " << v << " " << a << " x\n";
}
if(!maxy[u].empty()){
int a = *maxy[u].begin();
if(mapa.find(a) != mapa.end()){
int tmp = mapa[a];
dwu[tmp].push_back(ind);
dwu[ind].push_back(tmp);
}else{
mapa[a] = licznik;
odz[licznik] = a;
dwu[ind].push_back(licznik);
dwu[licznik].push_back(ind);
licznik++;
}
// cout << u << " " << v << " " << a << " y\n";
}
if(miny[v].size() < miny[u].size()){
swap(miny[v], miny[u]);
}
for(int i : miny[u]){
if(miny[v].find(i) != miny[v].end()){
miny[v].erase(i);
// cout << "u: " << u << " v: " << v << " w: " << i << " a\n";
continue;
}
miny[v].insert(i);
}
if(maxy[v].size() < maxy[u].size()){
swap(maxy[v], maxy[u]);
}
for(int i : maxy[u]){
if(maxy[v].find(i) != maxy[v].end()){
maxy[v].erase(i);
// cout << "u: " << u << " v: " << v << " w: " << i << " \n";
continue;
}
maxy[v].insert(i);
}
}
}
}
vector<int> match;
vector<char> vis;
bool powieksz(int v){
vis[v] = 1;
for(int u : dwu[v]){
if(match[u] == -1){
match[u] = v;
match[v] = u;
return true;
}
}
for(int u : dwu[v]){
if(match[u] != -1){
if(!vis[match[u]] && powieksz(match[u])){
match[u] = v;
match[v] = u;
return true;
}
}
}
return false;
}
void matching(int l){
match.assign(M, -1);
vis.assign(l + 2, 0);
while(true){
for(int u = 0; u <= l; u++) vis[u] = 0;
bool any = false;
for(int u = 0; u <= l; u++){
if(match[u] == -1 && !vis[u]){
if(powieksz(u) == true) any = true;
}
}
if(!any) break;
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
kraw.resize(n - 1);
for(int i = 0; i < n - 1; i++){
int a, b;
cin >> a >> b;
kraw[i] = {a, b};
graf[a].push_back({b, i});
graf[b].push_back({a, i});
}
int q;
cin >> q;
for(int i = 0; i < q; i++){
char znak;
int a, b, c;
cin >> znak >> a >> b >> c;
if(znak == 'm'){
miny[a].insert(c);
miny[b].insert(c);
}else{
maxy[a].insert(c);
maxy[b].insert(c);
}
}
dfs(1, -1);
// for(int i = 0; i < n - 1; i++){
// cout << "i: " << i << "\n";
// for(int j : dwu[i]){
// int val = odz[j];
// cout << j << " " << val << "\n";
// }
// cout << "\n";
// }
int l = n - 2;
matching(l);
// for(int i = 0; i <= n - 2; i++){
// cout << "i: " << i << " match: " << match[i] << "\n";
// }
vector<int> wyn(n - 1, 0);
for(int i = 0; i <= l; i++){
if(match[i] != -1){
int idx = match[i];
int val = odz[idx];
wyn[i] = val;
}
}
for(int i = 0; i < n - 1; i++){
cout << kraw[i].first << " " << kraw[i].second << " " << wyn[i] << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |