結果

問題 No.1254 補強への架け橋
ユーザー MayimgMayimg
提出日時 2020-10-23 12:30:46
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 206 ms / 2,000 ms
コード長 1,714 bytes
コンパイル時間 2,116 ms
コンパイル使用メモリ 212,520 KB
最終ジャッジ日時 2025-01-15 12:49:36
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 123
権限があれば一括ダウンロードができます

ソースコード

diff #

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
using namespace std;

class LowLinkBridge {
public:
  LowLinkBridge () {}
  LowLinkBridge (const vector<vector<int>>& g) { build(g); }
  void build (const vector<vector<int>>& g) {
    int n = g.size();
    b.clear();
    vector<int> ord(n), low(n), vis(n);
    int time = 0;
    function<void(int, int)> dfs = [&] (int cur, int par) {
      vis[cur] = true;
      ord[cur] = time++;
      low[cur] = ord[cur];
      for (int nbr : g[cur]) if (nbr != par) {
        if (vis[nbr]) {
          low[cur] = min(low[cur], ord[nbr]);
        } else {
          dfs (nbr, cur);
          low[cur] = min(low[cur], low[nbr]);
          if (low[nbr] > ord[cur]) {
            b.emplace_back(min(cur, nbr), max(cur, nbr));
          }
        }
      }
    };
    for (int i = 0; i < n; i++) if (!vis[i]) dfs (i, -1);
  }
  vector<pair<int, int>> getBriges (const vector<vector<int>>& g) {
    build(g);
    return b;
  }
  vector<pair<int, int>> getBriges () {
    return b;
  }
private:
vector<pair<int, int>> b;
};

signed main() {
  int n;
  cin >> n;
  vector<vector<int>> g(n);
  map<pair<int, int>, int> e2i;
  for (int i = 0; i < n; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
    e2i[make_pair(min(a, b), max(a, b))] = i;
  }
  LowLinkBridge bs(g);
  auto bridges = bs.getBriges();
  vector<int> is_bridge(n);
  for (auto p : bridges) is_bridge[e2i[p]] = 1;
  vector<int> ans;
  for (int i = 0; i < n; i++) if (!is_bridge[i]) ans.push_back(i);
  cout << ans.size() << endl;
  for (int i = 0; i < (int) ans.size(); i++) {
    if (i > 0) cout<< " ";
    cout << ans[i] + 1;
  }
  cout << endl;
  return 0;
}
0