結果
| 問題 |
No.1254 補強への架け橋
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-10-10 00:54:16 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 102 ms / 2,000 ms |
| コード長 | 1,388 bytes |
| コンパイル時間 | 1,899 ms |
| コンパイル使用メモリ | 183,064 KB |
| 実行使用メモリ | 20,224 KB |
| 最終ジャッジ日時 | 2024-07-20 15:06:23 |
| 合計ジャッジ時間 | 11,851 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 123 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr char newl = '\n';
typedef pair<int, int> P;
vector< vector<int> > G;
vector<int> ord, low;
vector<P> bridge;
void dfs(int cur, int par, int& t) {
ord[cur] = ++t;
low[cur] = ord[cur];
for (int nex : G[cur]) {
if (nex == par) continue;
if (ord[nex] == 0) {
dfs(nex, cur, t);
low[cur] = min(low[cur], low[nex]);
if (ord[cur] < low[nex]) bridge.push_back(minmax(cur, nex));
} else {
low[cur] = min(low[cur], ord[nex]);
}
}
}
void bridges(int v) {
ord.resize(v, 0);
low.resize(v);
int t = 0;
dfs(0, -1, t);
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> a(n), b(n);
G.resize(n);
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
--a[i]; --b[i];
if (a[i] > b[i]) swap(a[i], b[i]);
G[a[i]].push_back(b[i]);
G[b[i]].push_back(a[i]);
}
bridges(n);
set<P> s(bridge.begin(), bridge.end());
vector<int> ans;
for (int i = 0; i < n; i++) {
if (s.find(P(a[i], b[i])) == s.end()) ans.push_back(i + 1);
}
cout << ans.size() << newl;
for (size_t i = 0; i < ans.size(); i++) {
cout << ans[i] << " \n"[i + 1 == ans.size()];
}
return 0;
}