38 条题解

  • 0
    @ 2026-2-2 12:29:27
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+5;
    
    int n , m , a[N];
    int u , v;
    vector<int> vc[N];
    int dfn[N] , low[N] , cnt;
    bool vis[N];
    stack<int> st;
    int belong_cnt; //强连通分量个数 
    vector<int> belong[N];//强连通分量 
    int color[N];//color[i]表示第i头牛所处的强连通分量  
    vector<int> newvc[N];
    int in[N];//入度 
    int ans[N];
    void tarjan(int u)
    {
    	dfn[u] = low[u] = ++cnt;
    	vis[u] = 1;
    	st.push(u);
    	for(int i = 0; i < vc[u].size(); i++)
    	{
    		int v = vc[u][i];
    		if(!dfn[v])
    		{
    			tarjan(v);
    			low[u] = min(low[u] , low[v]);
    		}
    		else if(vis[v])
    		{
    			low[u] = min(low[u] , low[v]);
    		}	
    	}
    	//强连通分量到头	
    	if(dfn[u] == low[u])
    	{
    		while(!st.empty())
    		{
    			v = st.top();
    			st.pop();
    			vis[v] = 0;
    			color[v] = u;//当前牛所处的强连通分量 
    			if(u == v) break;
    			a[u] += a[v];
    		}
    	}
    }
    
    void tupo()
    {
    	queue<int> q;
    	for(int i = 1; i <= n; i++)
    	{
    		if(color[i] == i && !in[i])
    		{
    			q.push(i);
    			ans[i] = a[i];
    		}
    	}
    	
    	while(!q.empty())
    	{
    		int top = q.front();
    		q.pop();
    		
    		for(int i = 0; i < newvc[top].size(); i++)
    		{
    			v = newvc[top][i];
    			ans[v] = max(ans[v] , ans[top] + a[v]);
    			in[v]--;
    			if(!in[v])
    				q.push(v);
    		}
    	}
    	
    	int maxx = 0;
    	for(int i = 1; i <= n; i++)
    		maxx = max(maxx , ans[i]);
    	cout << maxx;
    }
    
    int main(){
    	cin >> n >> m;
    	for(int i = 1; i <= n; i++)
    		cin >> a[i];
    	while( m-- )
    	{
    		cin >> u >> v;
    		vc[u].push_back(v); 
    	}
    	for(int i = 1; i <= n; i++)
    		if(!dfn[i])
    			tarjan(i);
    	
    	//重新建边
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 0; j < vc[i].size(); j++)
    		{
    			v = vc[i][j];
    			if(color[i] != color[v])
    			{
    				newvc[color[i]].push_back(color[v]);
    				in[color[v]]++; 
    			}	
    		}	
    	} 
    	
    	tupo();
    	
    	return 0;
    

    信息

    ID
    1
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    4986
    已通过
    1406
    上传者