社区讨论

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 条回复,欢迎继续交流。

正在加载回复...