Tarjan + 贪心(?) 40 求助
查看原帖
Tarjan + 贪心(?) 40 求助
482610
Mortidesperatslav楼主2024/9/23 12:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct node{
	int v, c;
};
vector<node> G[100005];
int ig[100005], dfn[100005], low[100005], col[100005], vl[100005], a[100005];
int a1, a2, cnt, ign, ans, ccnt;
bool vis[100005];
vector<int> g[100005], SCC[100005];
stack<int> s;
queue<int> q;
bool vvis[100005];
int dis[2][100005];
void tarjan(int u){
	dfn[u] = low[u] = ++cnt;
	s.push(u);
	vis[u] = 1;
	for (auto &v : g[u]){
		if (!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}else if (vis[v])
			low[u] = min(low[u], dfn[v]);
	}
	if (dfn[u] == low[u]){
		ccnt++;
		while (!s.empty()){
			int v = s.top();
			s.pop();
			vis[v] = 0;
			col[v] = u;
			SCC[u].push_back(v);
			if (u == v)
				break;
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++){
		int ai, ci;
		cin >> ai >> ci;
		G[ai].push_back({i, ci});
		g[ai].push_back(i);
		a[i] = ci;
	}
	for (int i = 1; i <= n; i++)
		if (!dfn[i])
			tarjan(i);
	for (int i = 1; i <= n; i++){
		if (vvis[i])
			continue;
		if (SCC[col[i]].size() == 1)
			continue;
		if (SCC[col[i]].size() == n){
			cout << 0;
			return 0;
		}
		sort(SCC[col[i]].begin(), SCC[col[i]].end()); 
		int xz = INT_MAX;
		for (auto v : SCC[col[i]]){
			xz = min(xz, a[v]);
			vvis[v] = 1;
		}
		ans += xz;
	}
	for (int i = 1; i <= n; i++){
		if (vvis[i])
			continue;
		if (G[i].size() > 1){
			int xz = 0, sum = 0;
			for (auto tmp : G[i]){
				if (vvis[tmp.v])
					continue;
				xz = max(xz, tmp.c), sum += tmp.c;
			}
			ans += (sum - xz);
		}
	}
	cout << ans;
}
2024/9/23 12:07
加载中...