#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,u,w,vis[100005],no[100005],is[100005];
int pt,done,cycle[100005],bck[100005],mx,ans;
int node,dist,dp[100005],par[100005],we[100005];
vector<pair<int,int>> g[100005];
void dfs(int x,int p){
if (done) return;
if (vis[x]){
int cnt=0;
for (auto i:g[x]) cnt+=i.first==p;
if (cnt==2){
cycle[++pt]=x;
cycle[++pt]=p;
is[x]=true; is[p]=true;
}
else {
while (p!=x){
is[p]=true;
cycle[++pt]=p;
p=bck[p];
if (p==-1) break;
}
is[x]=true; cycle[++pt]=x;
}
done=true;
}
else {
vis[x]=1; bck[x]=p;
for (auto i:g[x]){
if (i.first!=p) dfs(i.first,x);
}
}
}
void mem(int x){
no[x]=1;
for (auto i:g[x]){
if (!no[i.first]) mem(i.first);
}
}
void dfs1(int x,int p,int d){
if (d>dist) {
node=x; dist=d;
}
for (auto i:g[x]) {
if (i.first!=p && !is[i.first]) dfs1(i.first,x,d+i.second);
}
}
void treedp(int x,int p){
for (auto i:g[x]){
if (is[i.first] || i.first==p) continue;
treedp(i.first,x);
}
for (auto i:g[x]){
if (is[i.first] || i.first==p) continue;
dp[x]=max(dp[x],dp[i.first]+i.second);
}
}
int weight(int x,int tar){
for (auto i:g[x]) if (i.first==tar) return i.second;
}
void work(){
int sum=0;
priority_queue<pair<int,int>> q;
for (int i=2;i<=pt;i++) we[i]=we[i+pt]=weight(cycle[i-1],cycle[i]);
we[pt+1]=weight(cycle[n],cycle[1]);
for (int i=1;i<=2*pt;i++) par[i]=par[i-1]+we[i];
for (int i=2;i<=pt;i++) q.push({par[i]+dp[cycle[i]],i});
for (int i=1;i<=pt;i++){
while (q.top().second<=i) q.pop();
//cout<<i<<" "<<q.top().first+dp[cycle[i]]-sum<<"\n";
mx=max(mx,q.top().first+dp[cycle[i]]-sum);
sum+=we[i+1]; q.push({par[pt+i]-par[i+1]+dp[cycle[i]]+sum,pt+i});
}
}
signed main(){
cin>>n;
for (int i=1;i<=n;i++){
cin>>u>>w;
g[i].push_back({u,w});
g[u].push_back({i,w});
bck[i]=-1;
}
for (int i=1;i<=n;i++){
if (no[i]) continue;
node=mx=dist=done=pt=0;
dfs(i,-1); mem(i);
if (done){
for (int j=1;j<=pt;j++){
treedp(cycle[j],-1);
for (auto k:g[cycle[j]]){
if (is[k.first]) continue;
node=dist=0;
dfs1(k.first,-1,0);
dfs1(node,-1,0);
mx=max(mx,dist);
}
}
if (pt==2){
int tmp=0;
for (auto j:g[cycle[1]]){
if (j.first==cycle[2]) tmp=max(tmp,j.second);
}
mx=max(mx,dp[cycle[1]]+dp[cycle[2]]+tmp);
}
else {
work();
reverse(cycle+1,cycle+1+pt);
work();
}
}
else {
dfs1(i,-1,0);
dfs1(node,-1,0);
mx=max(mx,dist);
}
// cout<<mx<<"\n";
ans+=mx;
}
cout<<ans<<"\n";
}
Compilation message
islands.cpp: In function 'long long int weight(long long int, long long int)':
islands.cpp:62:1: warning: control reaches end of non-void function [-Wreturn-type]
62 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
5204 KB |
Execution killed with signal 11 |
2 |
Runtime error |
4 ms |
5204 KB |
Execution killed with signal 11 |
3 |
Correct |
2 ms |
2772 KB |
Output is correct |
4 |
Correct |
2 ms |
2644 KB |
Output is correct |
5 |
Runtime error |
4 ms |
5160 KB |
Execution killed with signal 11 |
6 |
Runtime error |
5 ms |
5204 KB |
Execution killed with signal 11 |
7 |
Runtime error |
4 ms |
5204 KB |
Execution killed with signal 11 |
8 |
Runtime error |
5 ms |
5204 KB |
Execution killed with signal 11 |
9 |
Runtime error |
6 ms |
5204 KB |
Execution killed with signal 11 |
10 |
Incorrect |
2 ms |
2644 KB |
Output isn't correct |
11 |
Correct |
2 ms |
2644 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
8 ms |
5508 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
6 ms |
5556 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
23 ms |
8016 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
61 ms |
17308 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
148 ms |
34240 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
148 ms |
32872 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
5076 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
20 ms |
8040 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |