Submission #257683

# Submission time Handle Problem Language Result Execution time Memory
257683 2020-08-04T14:38:39 Z davooddkareshki Toll (APIO13_toll) C++17
16 / 100
3 ms 3456 KB
#include<bits/stdc++.h>

using namespace std;
 
#define int long long
#define F first 
#define S second 
#define pii pair<int,int> 
#define mpr make_pair

typedef long long ll;

const int maxn = 1e5+10;
const int mod = 1e9+7;
const ll inf = 1e18+10;

int n, m, k;

struct dsu
{
	int par[maxn];
	void f_reset() {memset(par, -1, sizeof par);}
	void reset() {for(int i = 0; i <= 27; i++) par[i] = -1;}	
	
	int get_par(int v)
	{
		if(par[v] < 0) return v;
		return par[v] = get_par(par[v]);		
	}
	
	void add(int u, int v)
	{
		u = get_par(u);
		v = get_par(v);
		
		if(u == v) return;
		if(par[u] < par[v]) swap(u,v);
		par[v] += par[u];
		par[u] = v;
	}
	
	bool ask(int u, int v) {return (get_par(u) == get_par(v));}
} dsu;

vector<int> T[maxn];
int sz[maxn], comp[maxn], p[maxn], mark[maxn], num;

void dfs(int v)
{
	mark[v] = 1;
	comp[v] = num; sz[num] += p[v];
	for(auto u : T[v])
		if(!mark[u]) dfs(u);
}

vector<int> Tree[25];
int pa[maxn], W[maxn], stt[maxn];
void dfs_T(int v)
{
	W[v] = inf;
	stt[v] = sz[v];
	for(auto u : Tree[v])
		if(u != pa[v])
		{
			pa[u] = v;
			dfs_T(u);
			stt[v] += stt[u];
		}
}

ll ans = 0;
void reset() 
{
	ans = 0;
	dsu.reset(); 
	for(int i = 0; i <= 25; i++) 
	{
		Tree[i].clear();
		W[i] = inf;
		pa[i] = 0;
		stt[i] = 0;
	}
}

signed main()
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);	
	
	cin>> n >> m >> k;
	vector<pair<int,pii>> edge, Bedge; vector<pii> Redge;
	for(int i = 1, u, v, c; i <= m; i++)
	{
		cin>> u >> v >> c;
		edge.push_back({c,{u,v}});
	}		
	sort(edge.begin(), edge.end());
	
	dsu.f_reset();
	vector<pair<int,pii>> mst;
	for(auto e : edge)
	{
		int u = e.S.F, v = e.S.S;
		if(!dsu.ask(u,v))
		{
			dsu.add(u,v);
			mst.push_back(e);
		}
	}
	edge = mst;

	dsu.f_reset();
	for(int i = 1, u, v; i <= k; i++)
	{
		cin>> u >> v;
		Redge.push_back({u,v});
		dsu.add(u,v);
	}
	
	for(auto e : mst)	
	{
		int u = e.S.F, v = e.S.S;
		if(!dsu.ask(u,v)) 
		{
			T[u].push_back(v);
			T[v].push_back(u);
			dsu.add(u,v);
		}
		else Bedge.push_back(e); // Bedge mishe yalaye hazfi
	}
	for(int i = 1; i <= n; i++) cin>> p[i];	
	
	
	// comp[Root = 1] = 1
	for(int i = 1; i <= n; i++)
		if(!mark[i]) 
		{
			num++; 
			dfs(i);
		}
	
	dsu.f_reset();
	ll last_ans = 0;
	for(int msk = 0; msk < (1<<k); msk++)
	{
		// in k ta dori nabashano ham bayad check koni
		
		reset();
		bool sw = 0;
		for(int i = 0; i < k; i++)
			if((1<<i) & msk)	
			{	
				int u = comp[Redge[i].F], v = comp[Redge[i].S];
				if(dsu.ask(u,v)) {sw = 1; break;}
				
				dsu.add(u,v);
				Tree[u].push_back(v);
				Tree[v].push_back(u);
			}
		if(sw) continue;	
		
		for(auto e : Bedge)
		{
			int u = comp[e.S.F], v = comp[e.S.S];
			if(!dsu.ask(u,v)) 
			{
				dsu.add(u,v);
				Tree[u].push_back(v);
				Tree[v].push_back(u);
			}
		}
		
		dfs_T(1);
		
		for(auto e : Bedge)
		{	
			int w = e.F, u = comp[e.S.F], v = comp[e.S.S];
			bool seen[num+2];
			memset(seen, 0, sizeof seen);
			while(u != 1)
			{	
				(seen[u] ^= 1);
				u = pa[u];
			}		
			while(v != 1)
			{
				(seen[v] ^= 1);
				v = pa[v];
			}	
			for(int i = 1; i <= num; i++)
				if(seen[i]) W[i] = min(W[i],w);			
			
			if(u == pa[v]) W[v] = 0;
			if(v == pa[u]) W[u] = 0;
		}	
		
		for(int i = 2; i <= num; i++) ans += stt[i] * W[i];
		last_ans = max(last_ans, ans);
	}
	
	cout<< last_ans;
}
/*
5 5 2
1 5 1
1 2 2
2 3 2
3 4 1
4 5 2
2 4
2 5
1 1 1 1 1
*/




























# Verdict Execution time Memory Grader output
1 Correct 2 ms 3456 KB Output is correct
2 Correct 2 ms 3456 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3456 KB Output is correct
2 Correct 2 ms 3456 KB Output is correct
3 Incorrect 3 ms 3456 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3456 KB Output is correct
2 Correct 2 ms 3456 KB Output is correct
3 Incorrect 3 ms 3456 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3456 KB Output is correct
2 Correct 2 ms 3456 KB Output is correct
3 Incorrect 3 ms 3456 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 3456 KB Output is correct
2 Correct 2 ms 3456 KB Output is correct
3 Incorrect 3 ms 3456 KB Output isn't correct
4 Halted 0 ms 0 KB -