社区讨论

Tarjan 95pts 求调

P4742[Wind Festival] Running In The Sky参与者 2已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mhpi7lu0
此快照首次捕获于
2025/11/08 07:45
4 个月前
此快照最后确认于
2025/11/08 07:45
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define dbug(x) (void)(cerr << #x << " = " << x << endl)

const int N = 2e5+86,M = 5e5 + 86;

ll n,m,w[N];

struct node{
	ll next, to;
}edge[M];

ll first[N] , cnt;

inline void add(ll u , ll v){
	cnt++;
	edge[cnt].to = v;
	edge[cnt].next = first[u];
	first[u] = cnt;
}

ll dfn[N] , low[N] , tot; 
bool book[N];
stack<ll> st;
ll sc , scc[N] ,scz[N] , scm[N];

inline void dfs(ll u){
	dfn[u] = low[u] = ++tot;
	book[u] = 1;
	st.push(u);
	
	for(ll i = first[u];i;i = edge[i].next){
		ll v = edge[i].to;
		if(!dfn[v]){
			dfs(v);
			low[u] = min(low[u] , low[v]);
		}else if(book[v]){
			low[u] = min(low[u] , dfn[v]);
		}
	}
	
	if(dfn[u] == low[u]){
		sc++;
		ll x = st.top();
		do{
			x = st.top();
			scc[x] = sc;
			scm[sc] = max(w[x] , scm[sc]);
			scz[sc] += w[x];
			book[x] = 0;
			st.pop();
		}while(x != u);
	}
}



int main() {
	
	
	cin >> n >> m;
	for(ll i = 1;i <= n;i++){
		cin >> w[i];
	}
	
	for(ll i = 1;i <= m;i++){
		ll u,v;
		cin >> u >> v;
		add(u,v);
	}
	
	for(ll i = 1;i <= n;i++){
		if(!dfn[i]) dfs(i);
	}
	
	// 重建图
	vector<unordered_set<ll> > e(sc + 5);
	for(ll u = 1;u <= n;u++){
		for(ll i = first[u] ;i; i = edge[i].next){
			ll v = edge[i].to;
			if(scc[u] != scc[v]){
				e[scc[u]].insert(scc[v]);
			}
		}
	}
	
    vector<ll> dis(sc + 5, 0); // dis[i]:从SCC i出发的最大权值和
    vector<ll> dmax(sc + 5, 0); // dmax[i]:从SCC i出发的最大权值
    ll ans = 0 , maxn = 0;
    for (ll i = 1; i <= sc; i++) {
        dis[i] = scz[i];
        dmax[i] = scm[i]; 
        for (ll v : e[i]) {
            dis[i] = max(dis[i], dis[v] + scz[i]);
            dmax[i] = max(dmax[i], dmax[v]);
        }
	    // 仅在总亮度最大的路径中更新maxn
	    if(dis[i] > ans){
	        ans = dis[i];          // 发现新的最大总亮度,更新ans
	        maxn = dmax[i];        // 该路径的最大单节点亮度成为当前maxn
	    }else if(dis[i] == ans){
	        maxn = max(maxn, dmax[i]);  // 总亮度相同,取更大的单节点亮度
	    }
    }

    cout << ans << " " << maxn;
	

	return ~~ (0 ^ 0);
}

只 WA 一个点,求大佬指点。

回复

7 条回复,欢迎继续交流。

正在加载回复...