求助,40分代码,找不出问题
查看原帖
求助,40分代码,找不出问题
374599
零到无穷大楼主2021/8/5 21:29

RT

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
stack<int> se;
vector<int> son[10001];
vector<int> s[1001];
int n,m,va[10001];
int dfn[10001]={0},low[10001]={0},index=1,num=1;
bool flag[10001];
int ggg[10001];
int dp[1001];
int guanxi[1001][1001];
void tarjan(int x)
{
	dfn[x]=low[x]=index++;
	se.push(x);
	flag[x]=1;
	for(int i=0;i<son[x].size();i++)
	{
		if(!dfn[son[x][i]])
		{
			tarjan(son[x][i]);
			low[x]=min(low[x],low[son[x][i]]);
		}
		else if(flag[son[x][i]]==1)
		  low[x]=min(low[x],dfn[son[x][i]]);
	}
	int g,nnn=0;
	if(dfn[x]==low[x])
    {
	   do
	   {
		  g=se.top();
		  se.pop();
		  nnn+=va[g];
		  flag[x]=0;
		  ggg[g]=num;
	   }while(x!=g);
	   dp[num]=nnn;
	   num++;
    }
}
int dfs(int x)
{
	for(int i=0;i<s[x].size();i++)	
	  dp[x]+=dp[s[x][i]];
	return dp[x];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>va[i];
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		son[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
	  if(!dfn[i])
	    tarjan(i);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
	  for(int j=0;j<son[i].size();j++)
	  {
	     if (guanxi[ggg[i]][ggg[son[i][j]]]==0&&ggg[i]!=ggg[son[i][j]])
	     {
	     	 guanxi[ggg[i]][ggg[son[i][j]]]=1;
	     	 s[ggg[i]].push_back(ggg[son[i][j]]);
	     }
	  }
	}
	for(int i=1;i<num;i++)
	  ans=max(ans,dfs(i));
	cout<<ans;
	return 0;
}

|*´Å`)ノ

2021/8/5 21:29
加载中...