社区讨论
加强版过了,而且特判一个联通快,但是此题WA#5
P2746[IOI 1996 / USACO5.3] 校园网 Network of Schools参与者 6已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yk58i
- 此快照首次捕获于
- 2025/11/21 05:43 4 个月前
- 此快照最后确认于
- 2025/11/21 05:43 4 个月前
已特判一个联通快
rt,求大佬差错
CPP#include <cstdio>
#define MAXN 10010
#define MAXM 5000005
#define MIN(A,B) ((A)<(B)?(A):(B))
#define MAX(A,B) ((A)>(B)?(A):(B))
using namespace std;
int head[MAXN],nxt[MAXM],vv[MAXM],tot;
void add_edge(int u, int v){
vv[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int dfn[MAXN],low[MAXN],cnt;
bool ins[MAXN];
int s[MAXN],top,col[MAXN],col_cnt;
void tarjan(int u){
dfn[u]=++cnt;
low[u]=cnt;
s[++top]=u;
ins[u]=1;
for(register int i=head[u];i;i=nxt[i]){
int v=vv[i];
if(dfn[v]==0){
tarjan(v);
low[u]=MIN(low[u], low[v]);
}else if(ins[v]){
low[u]=MIN(low[u], low[v]);
}
}
if(dfn[u]==low[u]){
col[u]=++col_cnt;
ins[u]=0;
while(s[top]!=u){
col[s[top]]=col[u];
ins[s[top]]=0;
--top;
}
--top;
}
}
int n,r[MAXN],c[MAXN];
int main()
{
scanf("%d", &n);
for(register int i=1;i<=n;++i){
int x;
while(1){
scanf("%d", &x);
if(x==0) break;
add_edge(i,x);
}
}
for(register int i=1;i<=n;++i)
if(dfn[i]==0)
tarjan(i);
for(register int u=1;u<=n;++u)
for(register int j=head[u];j;j=nxt[j]){
int v=vv[j];
if(col[u]!=col[v]){
++r[col[v]];
++c[col[u]];
}
}
int ans1=0,ans2=0;
for(register int i=1;i<=col_cnt;++i)
if(r[i]==0)
++ans1;
else if(c[i]==0)
++ans2;
ans2=MAX(ans1, ans2);
if(col_cnt==1) ans1=1,ans2=0;
printf("%d\n%d", ans1, ans2);
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...