社区讨论
我是女生刚学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 条回复,欢迎继续交流。
正在加载回复...