社区讨论

加强版过了,而且特判一个联通快,但是此题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 条回复,欢迎继续交流。

正在加载回复...