比赛 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;
}