dfs and similar dp dsu *1600

Please click on ads to support us..

C++ Code:

#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<algorithm>
#include<functional>
#include<numeric>
#include<cmath>

using namespace std;

#define endl "\n"
#define ain(a) for(int _i=0;_i<a.size();_i++) cin >> a[_i]
#define aout(a) for(int _i=0;_i<a.size();_i++) { if(_i > 0) cout << " "; cout << a[_i]; }; cout << endl
#define couty cout << "YES\n"
#define coutn cout << "NO\n"

#define pb push_back
#define eb emplace_back
#define all(a) a.begin(),a.end()

#ifdef LOCAL_JUDGE
#include "local.hpp"
#else
template <typename Head, typename... Tail> void dout(Head&& h, Tail&&... t) {}
#endif

typedef long long ll;
typedef pair<int,int> pii; typedef pair<ll,int> pli; typedef tuple<ll,int,int> tllii;
typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vll; typedef vector<vector<int> > vvi; typedef vector<string> vs;

template<class T> void amin(T &a, T b) { if (a > b) a = b; }
template<class T> void amax(T &a, T b) { if (a < b) a = b; }

const ll MOD = 1e9+7;

void solve() {
	int n, m , w; cin >> n >> m >> w;
	vi hw(n); ain(hw);
	vi hb(n); ain(hb);
	vvi g(n);
	for(int i=0;i<m;i++) {
		int u,v;
		cin >> u >> v; u--, v--;
		g[u].pb(v);
		g[v].pb(u);
	}
	// dout(g);
	vi component(n,-1);
	function<void(int,int)> dfs = [&](int u,int c) {
		if(component[u] >= 0) return;
		component[u] = c;
		for(auto v:g[u]) dfs(v,c);
	};
	int cid=0;
	for(int i=0;i<n;i++) if(component[i] < 0) {
		dfs(i,cid++);
	}
	vector<vector<pii>> groups(cid);
	for(int i=0;i<n;i++) {
		int c = component[i];
		groups[c].eb(hw[i],hb[i]);
	}
	// dout(groups);
	for(auto &g:groups) {
		int tw = 0, tb = 0;
		for(auto [w,b]:g) {
			tw += w;
			tb += b;
		}
		g.eb(tw,tb);
	}
	// dout(g);
	vi dp(1+w);
	for(auto &g:groups) {
		vi pdp = dp;
		for(auto [mw,mb]:g) {
			for(int tw=0;tw<=w-mw;tw++) {
				dp[tw+mw] = max(dp[tw+mw],pdp[tw]+mb);
			}
		}
	}
	cout << dp[w] << endl;
}

int main(int argc,char *argv[]) {
#ifdef LOCAL_JUDGE
	freopen(argc > 1 ? argv[1] : "in.txt", "r", stdin);
#endif
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	int t = 1;
	// cin >> t;
	for(int i=1;i<=t;i++) {
		dout("***",i);
		solve();
	}
}


Comments

Submit
0 Comments
More Questions

1621A - Stable Arrangement of Rooks
472A - Design Tutorial Learn from Math
1368A - C+=
450A - Jzzhu and Children
546A - Soldier and Bananas
32B - Borze
1651B - Prove Him Wrong
381A - Sereja and Dima
41A - Translation
1559A - Mocha and Math
832A - Sasha and Sticks
292B - Network Topology
1339A - Filling Diamonds
910A - The Way to Home
617A - Elephant
48A - Rock-paper-scissors
294A - Shaass and Oskols
1213A - Chips Moving
490A - Team Olympiad
233A - Perfect Permutation
1360A - Minimal Square
467A - George and Accommodation
893C - Rumor
227B - Effective Approach
1534B - Histogram Ugliness
1611B - Team Composition Programmers and Mathematicians
110A - Nearly Lucky Number
1220B - Multiplication Table
1644A - Doors and Keys
1644B - Anti-Fibonacci Permutation