社区讨论

我是女生刚学OI,80分求解

P3387【模板】缩点参与者 10已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@mi7w7wol
此快照首次捕获于
2025/11/21 04:37
4 个月前
此快照最后确认于
2025/11/21 06:32
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define maxn (100000+500)
using namespace std;
int bl[maxn],head[maxn],dp[maxn],v[maxn],w[maxn],n,m,tot=0;
int Scc=0,Index=0,frm[maxn],t[maxn],dfn[maxn],low[maxn];
stack<int> s;

struct edge
{
    int to,nxt;
}e[maxn];

void addedge(int u,int v)
{
    tot++;
    e[tot].to=v;
    e[tot].nxt=head[u];
    head[u]=tot;
}

void tarjan(int u)
{
    s.push(u);
    dfn[u]=low[u]=++Index;
    for (int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if (!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else low[u]=min(low[u],dfn[v]);
    }
    if (dfn[u]==low[u])
    {
        Scc++;
        while (s.top()!=u)
        {
            bl[s.top()]=Scc;
            w[Scc]+=v[s.top()];
            s.pop();
        }
        bl[s.top()]=Scc;
        w[Scc]+=v[s.top()];
        s.pop();
    }
}

void dfs(int u)
{
    if (dp[u]) return;
    dp[u]=w[u]; int mx=0;
    for (int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if (!dp[v]) dfs(v);
        mx=max(mx,dp[v]);
    }
    dp[u]+=mx;
}

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i) scanf("%d",&v[i]);
    for (int i=1;i<=m;++i)
    {
        scanf("%d%d",&frm[i],&t[i]);
        addedge(frm[i],t[i]);
    }
    for (int i=1;i<=n;++i) if (!dfn[i]) tarjan(i);
//    for (int i=1;i<=n;++i) printf("%d\n",bl[i]); puts("");
//    for (int i=1;i<=Scc;++i) printf("%d\n",w[i]);
    for (int i=1;i<=n;++i)
    	if (!bl[i]) bl[i]=++Scc,w[Scc]=v[i];
    
    tot=0;
    memset(head,0,sizeof(head));
    int ans=0;
    for (int i=1;i<=m;++i)
        if (bl[frm[i]]!=bl[t[i]])
            addedge(bl[frm[i]],bl[t[i]]);
    for (int i=1;i<=Scc;++i)
        if (!dp[i])
        {
            dfs(i);
            ans=max(ans,dp[i]);
        }
    printf("%d\n",ans);
    
    return 0;
}

回复

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

正在加载回复...