結果
| 問題 |
No.1254 補強への架け橋
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-10-10 01:17:31 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,694 bytes |
| コンパイル時間 | 1,418 ms |
| コンパイル使用メモリ | 123,104 KB |
| 最終ジャッジ日時 | 2025-01-15 06:07:46 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 119 |
ソースコード
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <tuple>
#include <vector>
using namespace std;
using ll = int64_t;
#define rep(i, j, n) for (int i = j; i < (n); ++i)
#define rrep(i, j, n) for (int i = (n)-1; j <= i; --i)
template <typename T>
std::ostream& operator<<(std::ostream& os, std::vector<T>& a) {
os << "{";
for (size_t i = 0; i < a.size(); ++i) os << (i > 0 ? "," : "") << a[i];
return os << "}";
}
[[maybe_unused]] constexpr ll MOD = 1000000007;
[[maybe_unused]] constexpr int INF = 0x3f3f3f3f;
[[maybe_unused]] constexpr ll INFL = 0x3f3f3f3f3f3f3f3fLL;
struct Edge {
int from, to;
Edge(int f, int t) : from(f), to(t) {}
};
using Edges = vector<Edge>;
using Graph = vector<Edges>;
class LowLink {
public:
LowLink(int n) : mGraph(n), mOrd(n), mLow(n), mUsed(n, false) {}
void add_edge(int u, int v) {
mGraph[u].emplace_back(u, v);
mGraph[v].emplace_back(v, u);
}
// e(u,v)が橋 <=> ord[u] < low[v]
// 頂点vが関節点 <=> ord[u] <= low[v]となるvの子uが存在
int dfs(int v, int pv, int k) {
mUsed[v] = true;
mOrd[v] = mLow[v] = k++; // 訪れた順
bool is_articulation = false;
int cnt = 0;
for (Edge nv : mGraph[v]) {
if (!mUsed[nv.to]) { // まだ訪れてない
++cnt;
k = dfs(nv.to, v, k);
mLow[v] = min(mLow[v], mLow[nv.to]);
is_articulation |= ~pv && mOrd[v] <= mLow[nv.to];
if (mOrd[v] < mLow[nv.to]) mBridges.emplace_back(minmax(v, nv.to));
} else if (nv.to != pv) { // 後退辺だったら
mLow[v] = min(mLow[v], mOrd[nv.to]);
}
}
is_articulation |= pv == -1 && cnt > 1;
if (is_articulation) mArticulationPoints.push_back(v);
return k;
}
void Init() {
int k = 0;
for (int i = 0; i < mGraph.size(); ++i) {
if (!mUsed[i]) k = dfs(i, -1, k);
}
}
vector<pair<int, int>> GetBridges() { return mBridges; }
vector<int> GetArticulationPoints() { return mArticulationPoints; }
private:
Graph mGraph;
vector<int> mOrd;
vector<int> mLow;
vector<bool> mUsed;
vector<pair<int, int>> mBridges;
vector<int> mArticulationPoints;
};
int main() {
int n, s, t;
cin >> n;
LowLink lowlink(n);
vector<pair<int, int>> es;
for (int i = 0; i < n; ++i) {
cin >> s >> t;
--s;
--t;
es.emplace_back(s, t);
lowlink.add_edge(s, t);
}
lowlink.Init();
auto ans = lowlink.GetBridges();
map<pair<int, int>, bool> mp;
for (auto p : ans) mp[p] = true;
cout << n - ans.size() << '\n';
for (int i = 0; i < n; ++i)
if (!mp[es[i]]) cout << i + 1 << " \n"[i == n - 1];
return 0;
}