社区讨论

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 条回复,欢迎继续交流。

正在加载回复...