社区讨论
求条(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 条回复,欢迎继续交流。
正在加载回复...