社区讨论

求条(16pts)

P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhjspjok
此快照首次捕获于
2025/11/04 07:53
4 个月前
此快照最后确认于
2025/11/04 07:53
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
stack<int> stk;
int dfnCnt,n,m,sccCnt;
vector<int> g[10004],g2[10005],scc[10005];
int dfn[10005],low[10005];
int sccTag[10005],inD[10005];
bool inStk[10005];
bool toposort(){
	int cnt=0;
	queue<int> q;
	for(int i=1; i<=sccCnt; i++){
		if(inD[i]==0){
			q.emplace(i);
		}
	}
	while(!q.empty()){
		int x=q.front();
		cnt++;
		q.pop();
		for(const auto &vi:g2[x]){
			inD[vi]--;
			if(!inD[vi]) q.emplace(vi);
		}
	}
	if(cnt==sccCnt) return 1;
	else return 0;
}
void tarjan(int u){
	low[u]=dfn[u]=++dfnCnt;
	stk.emplace(u);
	inStk[u]=1;
	for(auto& v:g[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(inStk[v]){
			low[u]=min(low[u],low[v]);
		}
	}
	if(dfn[u]==low[u]){
		while(stk.top()!=u){
			int v=stk.top();
			scc[sccCnt].emplace_back(v);
			sccTag[v]=sccCnt;
			inStk[v]=0;
			stk.pop();
		}
		int v=stk.top();
		scc[sccCnt].emplace_back(v);
		sccTag[v]=sccCnt;
		inStk[v]=0;
		stk.pop();
		sccCnt++;
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1; i<=m;i++){
		int u,v;
		cin>>u>>v;
		g[u].emplace_back(v);
	} 
	for(int i=1; i<=n; i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int u=1; u<=n; u++){
		for(auto& v:g[u]){
			if(sccTag[u]!=sccTag[v])
			g2[sccTag[v]].emplace_back(sccTag[u]),inD[sccTag[u]]++;
		}
	}
	int tipcnt=0,tipi=0;
	for(int i=1; i<=sccCnt; i++){
		if(g2[i].size()==0) tipcnt++,tipi=i;
	}
	if(tipcnt>1 || tipcnt==0){cout<<0; return 0;}
	if(toposort()){cout<<scc[tipi].size();return 0;}
	else cout<<0<<"\n";
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...