社区讨论
求助48pts玄关
P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m6utrys1
- 此快照首次捕获于
- 2025/02/07 21:51 去年
- 此快照最后确认于
- 2025/02/08 10:05 去年
感觉思路没问题可只拿了48pts,回复闭关
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5;
struct node{
int nt,end;
}edge[50005];
int cnt,head[N];
void add(int u,int v){
cnt++;
edge[cnt].nt=head[u];
head[u]=cnt;
edge[cnt].end=v;
}
int dfn[N],low[N],vis[N],co[N],tot,col;
stack<int> stk;
void tarjan(int u){
dfn[u]=low[u]=++tot;
stk.push(u);
vis[u]=1;
for(int i=head[u];i;i=edge[i].nt){
int v=edge[i].end;
if(dfn[v]==0){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]==1){
low[u]=min(low[u],low[v]);
}
}
if(dfn[u]==low[u]){
co[u]=++col;
while(stk.top()!=u){
co[stk.top()]=col;
vis[stk.top()]=0;
stk.pop();
}
vis[u]=0;
stk.pop();
}
return ;
}
int n,m,u,v;
int number[N],fan[N],ans;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
number[co[i]]++;
fan[co[i]]++;
}
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=edge[j].nt){
int v=edge[j].end;
if(co[i]!=co[v])fan[co[v]]+=number[co[i]];
}
}
for(int i=1;i<=n;i++){
if(fan[co[i]]==n)ans++;
}
printf("%lld",ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...