# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1273019 | goulthen | Rigged Roads (NOI19_riggedroads) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define per(i,a,b) for(int i = a; i >= b; i--)
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
const int MAXN = 1e3+10;
const int INF = 1e18+10;
vector<int> g[MAXN];
int u[MAXN], v[MAXN], tin[MAXN], tout[MAXN], val[MAXN];
int span[MAXN];
int t = 0;
void dfs(int u, int p = -1) {
tin[u] = ++t;
for (int &v : g[u]) if (v!=p) dfs(v,u);
tout[u] = ++t;
}
bool chd(int u, int v) {
// v child of u
return tin[u] <= tin[v] && tout[u] >= tout[v];
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(nullptr);
int n,m; cin >> n >> m;
rep(i,1,m) cin >> u[i] >> v[i];
rep(i,1,n-1) {
int c;cin >> c;
span[i] = c;
int x = u[c], y=v[c];
g[x].pb(y);
g[y].pb(x);
}
dfs(1);
int cur = 0;
rep(i,1,m) {
if(val[i]) continue;
vector<int> vc;
rep(j,1,n-1) {
if (((chd(u[span[j]],u[i]) && chd(v[span[j]],u[i])) || (chd(u[span[j]],v[i]) && chd(v[span[j]],v[i]))) && !val[j]) vc.pb(span[j]);
}
sort(vc.begin(), vc.end());
for (int &x : vc) val[x] = ++cur;
if(!val[i]) val[i] = ++cur;
}
rep(i,1,m) cout << val[i] << " \n"[i==m];
return 0;
}