社区讨论
WA 40pts 求条
P3387【模板】缩点参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdhovb
- 此快照首次捕获于
- 2025/11/04 00:47 4 个月前
- 此快照最后确认于
- 2025/11/04 00:47 4 个月前
调了半天始终无法战胜
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> g[10010];
vector<int> gn[10010];
struct edge
{
int x,y;
}e[100010];
int dfn[10010],low[10010];
int w[10010],cnt,tot,n,m;
int wn[10010];
bool vis[10010];
stack<int> s;
unordered_map<int,int> scc;
void tarjan(int u)
{
dfn[u]=low[u]=++tot;
s.push(u);
vis[u]=1;
for(auto v:g[u])
{
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
cnt++;
while(s.top()!=u)
{
scc[s.top()]=cnt;
vis[s.top()]=0;
wn[cnt]+=w[s.top()];
s.pop();
}
scc[u]=cnt;
wn[cnt]+=w[u];
s.pop();
}
}
int ma=-1,in[10010];
int dp[10010];
bool b[10010];
queue<int> q;
void topo()
{
for(int i=1;i<=cnt;i++)
{
if(in[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
int u=q.front();
b[u]=1;
q.pop();
ma=max(ma,wn[u]);
for(auto v:gn[u])
{
if(b[v])continue;
dp[v]=max(dp[u]+wn[v],dp[v]);
in[v]--;
if(in[v]==0)q.push(v);
}
}
}
signed main()
{
cin>>n>>m;
int id=0;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
e[++id]={u,v};
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=id;i++)
{
if(scc[e[i].x]!=scc[e[i].y])gn[scc[e[i].x]].push_back(scc[e[i].y]);
if(scc[e[i].x]!=scc[e[i].y])in[scc[e[i].y]]++;
}
topo();
cout<<ma;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...