萌新90分求助
查看原帖
萌新90分求助
120855
清雅流水楼主2020/6/1 09:56
#include <bits/stdc++.h>
using namespace std ;
long long dq[10010] , n , m ;
bool bj[10010][10010] ;
long long jh[10010] , js = 1 ;
bool vis[10010] ;
long long in[10010] , lo[10010] ;
long long sta[10010] , top ;
long long jq[10010] ;
bool bj2[10010][10010] ;
long long kq[10010] ;
long long dp[10010] ;
void dfs( long long wz )
{
	sta[top] = wz ;
	top ++ ;
	vis[wz] = 1 ;
	lo[wz] = in[wz] ;
//	cout<< wz << ' ' << in[wz] << ' ' << lo[wz] << endl ;
//	for( long long i = 0 ; i < top ; i ++ )
//	{
//		cout<< sta[i] << ' ' ;
//	}
//	cout<< endl << "_____" << endl ;
	for( long long i = 0 ; i < n ; i ++ )
	{
		if( bj[wz][i] )
		{
			if( in[i] == 0 )
			{
				in[i] = in[wz] + 1 ;
				dfs( i ) ;
				lo[wz] = min( lo[wz] , lo[i] ) ;
			}
			else
			{
				if( vis[i] )
				{
					lo[wz] = min( lo[wz] , lo[i] ) ;
				}
			}
		}
	}
	if( lo[wz] == in[wz] )
	{
//		cout<< wz << ' ' << in[wz] << ' ' << lo[wz] << endl ;
		do
		{
			jq[js] += dq[sta[top - 1]] ;
			jh[sta[top - 1]] = js ;
			vis[sta[top - 1]] = 0 ;
//			cout<< sta[top - 1] << ' ' ;
			top -- ;
		}
		while( wz != sta[top] ) ;
		js ++ ;
//		cout<< endl ;
	}
}
void topo()
{
	queue<long long> q ;
	for( long long i = 0 ; i < js ; i ++ )
	{
		if( kq[i] == 0 )
		{
			q.push( i ) ;
		}
	}
	long long v ;
	while( q.size() != 0 )
	{
		v = q.front() ;
		q.pop() ;
		dp[v] += jq[v] ;
		for( long long i = 0 ; i < js ; i ++ )
		{
			if( bj2[v][i] )
			{
				kq[i] -- ;
				dp[i] = max( dp[i] , dp[v] ) ; 
				if( kq[i] == 0 )
				{
					q.push( i ) ;
				}
			}
		}
	}
}
int main ()
{
	freopen( "p3387_7.in" , "r" , stdin ) ;
	cin >> n >> m ;
	for( long long i = 0 ; i < n ; i ++ )
	{
		cin>> dq[i] ;
	}
	long long t1 , t2 ;
	for( long long i = 0 ; i < m ; i ++ )
	{
		cin >> t1 >> t2 ;
		t1 -- ;
		t2 -- ;
		bj[t1][t2] = 1 ;
	}
	for( long long i = 0 ; i < n ; i ++ )
	{
		if( in[i] == 0 )
		{
			in[i] = 1 ;
			dfs( i ) ;
		}
	}
	for( long long i = 0 ; i < n ; i ++ )
	{
		for( long long j = 0 ; j < n ; j ++ )
		{
			if( bj[i][j] && jh[i] != jh[j] && bj2[jh[i]][jh[j]] == 0 )
			{
				bj2[jh[i]][jh[j]] = 1 ;
				kq[jh[j]] ++ ;
			}
		}
	}
	topo() ;
	long long maxn = 0 ;
	for( long long i = 0 ; i < js ; i ++ )
	{
		if( dp[i] > maxn )
		{
			maxn = dp[i] ;
		}
	}
	cout<< maxn ;
	return 0 ;
}

RT

7号点WA

dq、bj为缩点前点权、边(邻接矩阵)

jh为缩点时各点所属强连通分量,js为强连通分量个数

sta为栈,in为时间戳,lo为最小时间戳

jq、bj2为缩点后点、边

kq为入边数量,dp就是dp

思路是先缩点,之后用DAG上的dp求最长路

2020/6/1 09:56
加载中...