社区讨论
Trajan模板求调
灌水区参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m2n1w2rt
- 此快照首次捕获于
- 2024/10/24 16:37 去年
- 此快照最后确认于
- 2025/11/04 16:20 4 个月前
C
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
struct chain_forward_star{int nxt,to;}edge[N<<1];
int head[N],cnt[N],n,m,ecnt;
int scc_id[N],dfn[N],low[N],dcnt,scnt;
stack<int>stk;
inline void add(int u,int v){edge[++ecnt]={head[u],v},head[u]=ecnt;}
void tarjan(int u){
dfn[u]=low[u]=++dcnt,stk.push(u);
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
else if(!scc_id[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
scnt++;
while(stk.top()!=u) scc_id[stk.top()]=scnt,stk.pop();
scc_id[stk.top()]=scnt,stk.pop();
}
}
void solve(){
memset(head,0,sizeof(head)),ecnt=0;
for(int x,y;m--;){
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++) dfn[i]=low[i]=scc_id[i]=0;
scnt=dcnt=0;
while(!stk.empty()) stk.pop();
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
printf("%d\n",scnt);
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF) solve();
return 0;
}
似乎是RE?
回复
共 9 条回复,欢迎继续交流。
正在加载回复...