2 条题解
-
1
#include<bits/stdc++.h> using namespace std; const int N=5e5+10; vector<int>G[N],G2[N]; int dfn[N],low[N],scc[N],tsp,cnt,siz[N]; stack<int>stk;bool instk[N]; void tarjan(int x) { dfn[x]=low[x]=++tsp; stk.push(x);instk[x]=1; for(int y:G[x]) { if(!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); } else if(instk[y])low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]) { cnt++; int z=-1; while(z!=x) { z=stk.top(),stk.pop(),instk[z]=0; scc[z]=cnt;siz[cnt]++;G2[cnt].push_back(z); } } } int main() { int n,m;cin>>n>>m; for(int i=1;i<=m;i++) { int x,y;cin>>x>>y;x++,y++; G[x].push_back(y); } for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i); cout<<cnt<<'\n'; for(int i=cnt;i>=1;i--) { cout<<siz[i]<<' '; for(int y:G2[i])cout<<y-1<<' '; cout<<'\n'; } return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N = 5e5 + 10; int dfn[N], low[N], scc[N], tsp = 0, cnt = 0, siz[N]; vector<int> G[N], ring[N]; stack<int> stk; bool instk[N]; void tarjan(int x) { dfn[x] = low[x] = ++tsp; stk.push(x); instk[x] = 1; for (auto y : G[x]) { if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); } else if (instk[y]) low[x] = min(low[x], dfn[y]); } if (low[x] == dfn[x]) { cnt ++; int z = -1; while (z != x) { z = stk.top(); stk.pop(); instk[z] = 0; scc[z] = cnt; siz[cnt] ++; ring[cnt].push_back(z); } } } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; x ++; y ++; G[x].push_back(y); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); cout << cnt << '\n'; for (int i = cnt; i >= 1; i--) { cout << siz[i] << ' '; for (auto j : ring[i]) cout << j - 1 << ' '; cout << endl; } return 0; }
- 1
信息
- ID
- 8162
- 时间
- 500ms
- 内存
- 1024MiB
- 难度
- 6
- 标签
- 递交数
- 35
- 已通过
- 11
- 上传者