缩点模板求助
查看原帖
缩点模板求助
190485
CH_mengxiang楼主2022/11/17 23:38

40分 WA1,3,4,5,7,9

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5,M=1e5+5;
int fir[N],from[M],nxt[M],to[M],tot;
void add(int u,int v)
{
	nxt[++tot]=fir[u];
	fir[u]=tot;
	from[tot]=u;
	to[tot]=v;
}
int w[N],val[N],dfn[N],low[N],s[N],co[N],col,num,top;
bool book[N];
void tarjan(int u)
{
	dfn[u]=low[u]=++num,s[++top]=u,book[u]=1;
	for (int e=fir[u];e;e=nxt[e])
	{
		int v=to[e];
		if (!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if (book[v]) low[u]=min(low[u],dfn[v]);
	}
	if (dfn[u]==low[u])
	{
		col++;
		do
		{
			co[s[top]]=col;
			val[col]+=w[s[top]];
			book[s[top--]]=0;
		}while (u!=s[top+1]);
	}
}
vector<int> e1[N];
vector<int> e2[N];
int in[N],ans[N];
void topo_sort()
{
	queue<int> q;
	for (int i=1;i<=col;i++)
	  if (!in[i]) q.push(i);
	while (!q.empty())
	{
		int u=q.front();
		q.pop();
		ans[++ans[0]]=u;
		for (auto v:e1[u])
		{
			in[v]--;
			if (!in[v]) q.push(v);
		}
	}
}
int dp[N];
int DP()
{
	for (int i=1;i<=col;i++)
	{
		int k=ans[i];
		dp[k]=val[k];
		for (auto j:e2[k])
		  dp[k]=max(dp[k],dp[j]+val[k]);
	}
	int res=0;
	for (int i=1;i<=col;i++)
	  res=max(res,dp[i]);
	return res;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n,m,u,v;
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	  cin>>w[i];
	while (m--)
	{
		cin>>u>>v;
		add(u,v);
	}
	for (int i=1;i<=n;i++)
	  if (!dfn[i]) tarjan(i);
	for (int i=1;i<=tot;i++)
	{
		u=from[i],v=to[i];
		if (co[u]!=co[v])
		{
			in[v]++;
			e1[u].push_back(v);
			e2[v].push_back(u);
		}
	}
	topo_sort();
	cout<<DP()<<'\n';
	return 0;
}

自己写的查不出问题来,题解改了变量名、改了邻接表也寄了,这什么玄学情况。

2022/11/17 23:38
加载中...