比赛 |
4043级NOIP2022欢乐赛9th |
评测结果 |
AAAAAAAAAAA |
题目名称 |
Visits |
最终得分 |
100 |
用户昵称 |
yrtiop |
运行时间 |
0.728 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2022-11-25 08:20:55 |
显示代码纯文本
#include <bits/stdc++.h>
#define pb emplace_back
const int maxn = 2e5 + 5;
int n,a[maxn],val[maxn],dfn[maxn],tot,low[maxn],cnt,stk[maxn],tp;
bool ins[maxn];
std::vector<int> G[maxn],scc[maxn];
void tarjan(int u) {
dfn[u] = low[u] = ++ cnt;
stk[++ tp] = u;
ins[u] = true;
for(auto& v : G[u]) {
if(!dfn[v]) {
tarjan(v);
low[u] = std::min(low[u] , low[v]);
}
else if(ins[v])
low[u] = std::min(low[u] , dfn[v]);
}
if(dfn[u] == low[u]) {
++ tot;
do {
ins[stk[tp]] = false;
scc[tot].pb(stk[tp]);
} while(stk[tp --] != u);
}
return ;
}
int main() {
freopen("prob1_silver_22open.in","r",stdin);
freopen("prob1_silver_22open.out","w",stdout);
scanf("%d",&n);
long long ans = 0;
for(int i = 1;i <= n;++ i) {
scanf("%d %d",&a[i],&val[i]);
ans += val[i];
G[i].pb(a[i]);
}
for(int i = 1;i <= n;++ i)
if(!dfn[i])tarjan(i);
for(int i = 1;i <= tot;++ i) {
if(scc[i].size() <= 1)continue ;
int cur = 1e9;
for(auto& v : scc[i])
cur = std::min(cur , val[v]);
ans -= cur;
}
printf("%lld\n",ans);
return 0;
}