結果
問題 | No.1254 補強への架け橋 |
ユーザー | mugen_1337 |
提出日時 | 2020-10-24 20:09:53 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 73 ms / 2,000 ms |
コード長 | 2,849 bytes |
コンパイル時間 | 1,971 ms |
コンパイル使用メモリ | 206,080 KB |
最終ジャッジ日時 | 2025-01-15 15:22:53 |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 123 |
ソースコード
#include<bits/stdc++.h> using namespace std; #define ALL(x) begin(x),end(x) #define rep(i,n) for(int i=0;i<(n);i++) #define debug(v) cout<<#v<<":";for(auto x:v){cout<<x<<' ';}cout<<endl; #define mod 1000000007 using ll=long long; const int INF=1000000000; const ll LINF=1001002003004005006ll; int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; // ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} template<class T>bool chmax(T &a,const T &b){if(a<b){a=b;return true;}return false;} template<class T>bool chmin(T &a,const T &b){if(b<a){a=b;return true;}return false;} struct IOSetup{ IOSetup(){ cin.tie(0); ios::sync_with_stdio(0); cout<<fixed<<setprecision(12); } } iosetup; template<typename T> ostream &operator<<(ostream &os,const vector<T>&v){ for(int i=0;i<(int)v.size();i++) os<<v[i]<<(i+1==(int)v.size()?"":" "); return os; } template<typename T> istream &operator>>(istream &is,vector<T>&v){ for(T &x:v)is>>x; return is; } struct LowLink{ const vector<vector<int>> &g; vector<int> used,ord,low; vector<int> articulation;// 関節点 vector<pair<int,int>> bridge;// 橋 LowLink(const vector<vector<int>> &g):g(g){} int dfs(int pre,int now,int k){ used[now]=1; ord[now]=k++; low[now]=ord[now]; bool is_articulation=false,multi_edge=false; int cnt=0; for(auto &to:g[now]){ if(to==pre and !multi_edge){ multi_edge=true; continue; } if(!used[to]){ cnt++; k=dfs(now,to,k); low[now]=min(low[now],low[to]); is_articulation|=(pre>=0 and low[to]>=ord[now]); if(ord[now]<low[to]) bridge.push_back(minmax(now,to)); }else{ // 後退辺 low[now]=min(low[now],ord[to]); } } // 根の場合子が2個以上いれば関節点 is_articulation|=(pre==-1 and cnt>1); if(is_articulation) articulation.push_back(now); return k; } void build(){ used.assign(g.size(),0); ord.assign(g.size(),0); low.assign(g.size(),0); int k=0; for(int i=0;i<(int)g.size();i++)if(!used[i]) k=dfs(-1,i,k); } bool isBridge(int u,int v){ if(ord[u]>ord[v]) swap(u,v); return ord[u]<low[v]; } }; using P=pair<int,int>; signed main(){ int n;cin>>n; vector<P> es; vector<vector<int>> g(n); rep(i,n){ int u,v;cin>>u>>v;u--,v--; es.emplace_back(u,v); g[u].push_back(v); g[v].push_back(u); } LowLink link(g); link.build(); vector<int> res; rep(i,n){ auto [u,v]=es[i]; if(!link.isBridge(u,v)) res.push_back(i+1); } cout<<res.size()<<endl; cout<<res<<endl; return 0; }