社区讨论
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 条回复,欢迎继续交流。
正在加载回复...