Source Code
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
#define all(v) v.begin(), v.end()
#define pb push_back    
#define sz(x) (int)(x).size()
const int N = 3e5 + 5;
void solve() {
    int n;
    cin >> n;
    map<char, int> m;
    m['U'] = 0;
    m['D'] = 1;
    m['L'] = 2;
    m['R'] = 3;
    m['&'] = 13;
    vector<vi> deg(n + 10, vi(15)), dp(n + 4, vi(15, 1)), vis(n + 4, vi(15, 0));
    vi can(n + 5, 1);
    // vis(n + 5, 0), dp(n + 5, 0),
    vector<vector<pii>> g(n + 5);
    for(int i = 0; i < n - 1; ++i){
        int u, v;
        char c;
        cin >> u >> v >> c;
        g[u].pb({v, c});
        g[v].pb({u, c});
        ++deg[u][m[c]];
        ++deg[v][m[c]];
        if(deg[u][m[c]] >= 2)   
            can[u] = 0;
        if(deg[v][m[c]] >= 2)   
            can[v] = 0;
    }
    // cout << can[1] << '\n';
    auto check = [&](char c, char d){
        return (c == 'L' && d == 'R') || (c == 'R' && d == 'L')
                || (c == 'D' && d == 'U') || (c == 'U' && d == 'D');
    };
    int src;
    function<int(int, char, int)> dfs = [&](int u, char d, int par) -> int { 
        int j = m[d];
        // if(vis[u][j] == 1)
        //     return dp[u][j];
        // int &ret = dp[u][j];
        int ret = 1;
        vi cdeg(4);
        for(int i = 0; i < 4; ++i){
            cdeg[i] = deg[u][i] - (j == i);
            ret &= (cdeg[i] < 2);
        }
        vis[u][j] = 1;
        for(auto [v, c] : g[u]){
            if(check(c, d)){
                // if(n == 4 && src == 4)
                    // printf("par = %d u = %d v = %d c = %c\n", par, u, v, c);
                ret = 0;
            }else if(par != v){
                // if(n == 4 && src == 4)
                    // printf("par = %d u = %d v = %d c = %c\n", par, u, v, c);
                ret &= dfs(v, c, u);
            }
        }
        return ret;
    };
    vi ans;
    for(int i = 1; i <= n; ++i){
        bool ok = 1;
        if(can[i]){
            // if(n == 8)
            // printf("i = %d\n", i);
            src = i;
            ok &= dfs(i, '&', -1);
        }else{
            ok = 0;
        }
        if(ok)
            ans.pb(i);
    }
    for(int x : ans)
        cout << x << ' ';
}
int main() {
    // cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    cin >> t;
    // scanf("%d",&t);
    while(t--)
        solve(), cout << '\n';
}
Copy
Flow Sources I noomaK
GNU G++17
2100 ms
2.1 MB
Time Limit Exceeded