Submission #1160934

#TimeUsernameProblemLanguageResultExecution timeMemory
1160934aegRigged Roads (NOI19_riggedroads)C++20
0 / 100
121 ms15500 KiB
#include <bits/stdc++.h>
using namespace std;

struct dsu {
  vector<int> vec;
  int finddsu(int s) {
    if(vec[s] < 0) return s;
    return vec[s] = finddsu(vec[s]);
  }
  void unify(int a, int b) {
    a = finddsu(a), b = finddsu(b);
    if(a == b) return;
    if(vec[a] < vec[b]) swap(a, b);
    vec[b] += vec[a];
    vec[a] = b;
  }
  dsu(int n) : vec(n, -1) {}
};

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, e;
  cin >> n >> e;
  vector<pair<int, int>> adj(e, {0, 0});
  for(auto &[x, y]: adj) {
    cin >> x >> y;
    x--;
    y--;
  }
  set<int> s;
  for (int i = 1; i < n; i++) {
    int j;
    cin >> j;
    j --;
    s.insert(j);
  }
  int val = 1, nonval = n;
  vector<int> ans(e);
  dsu a(e);
  for (int i = 0; i < e; i++) {
    if (s.count(i)) {
      ans[i] = val++;
      a.unify(adj[i].first, adj[i].second);
      continue;
    }
    if (a.finddsu(adj[i].first) == a.finddsu(adj[i].second)) {
      ans[i] = val++;
      nonval++;
      continue;
    } else {
      ans[i] = nonval++;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...