This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define taskname "test"
#define fi first
#define se second
#define pb push_back
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
using ll = long long;
using ull = unsigned ll;
using ld = long double;
using pii = pair <int, int>;
using pil = pair <int, ll>;
using pli = pair <ll, int>;
using pll = pair <ll, ll>;
mt19937 Rand(chrono::steady_clock::now().time_since_epoch().count());
ll min(const ll &a, const ll &b){
return (a < b) ? a : b;
}
ll max(const ll &a, const ll &b){
return (a > b) ? a : b;
}
//const ll Mod = 1000000007;
//const ll Mod2 = 999999999989;
//only use when required
const int maxN = 1e5 + 1;
const int maxM = 3e5 + 1;
const int maxK = 21;
const int inf = 0x3f3f3f3f;
int n, m, k;
struct TEdge{
int u, v, w;
bool operator < (const TEdge &other){
return w < other.w;
}
};
TEdge a[maxM + maxK];
vector <int> edge;
struct TDSU{
vector <int> lab;
TDSU(){}
TDSU(int _n){
lab.resize(_n, -1);
}
inline void resize(int _n){
lab.resize(_n, -1);
}
inline int find(int u){
if (lab[u] < 0) return u;
return lab[u] = find(lab[u]);
}
inline void merge(int u, int v){
if (lab[u] > lab[v]) swap(u, v);
lab[u] += lab[v];
lab[v] = u;
}
inline void clear(){
lab.clear();
}
inline void reset(int _n){
clear();
resize(_n);
}
};
TDSU dsu;
int p[maxN];
int id[22];
int depth[22];
int node_cnt = 0;
ll sum[22];
vector <TEdge> required;
bool mark[22];
ll res = 0;
vector <pii> adj[maxN];
ll sm[22];
int par[22];
void dfs(int u, int p){
sm[u] = sum[u];
par[u] = p;
depth[u] = depth[p] + 1;
for (auto i: adj[u]){
if (i.fi == p) continue;
if (i.se != -inf) mark[i.fi] = 1;
dfs(i.fi, u);
sm[u] += sm[i.fi];
}
adj[u].clear();
}
void update(int u, int v, int w){
if (depth[u] < depth[v]) swap(u, v);
while (depth[u] != depth[v]){
if (!mark[u]) res += sm[u] * w;
sm[u] = 0;
u = par[u];
}
while (u != v){
if (!mark[u]) res += sm[u] * w;
if (!mark[v]) res += sm[v] * w;
sm[u] = sm[v] = 0;
u = par[u];
v = par[v];
}
}
ll cal(int mask){
res = 0;
int mophat = mask;
fill(mark, mark + node_cnt + 1, 0);
dsu.reset(node_cnt + 1);
for (int i = 1; i <= node_cnt; ++i)
while (mask){
int t = mask & -mask;
int i = __lg(t) + 1;
int u = a[i].u; int v = a[i].v;
int x = dsu.find(u), y = dsu.find(v);
if (x == y){
return 0;
}
dsu.merge(x, y);
adj[u].pb({v, -inf});
adj[v].pb({u, -inf});
mask -= t;
}
vector <TEdge> check;
for (auto i: required){
int x = dsu.find(i.u), y = dsu.find(i.v);
if (x != y){
dsu.merge(x, y);
adj[i.u].pb({i.v, i.w});
adj[i.v].pb({i.u, i.w});
}
else check.pb(i);
}
dfs(1, 0);
for (auto i: check){
update(i.u, i.v, i.w);
}
return res;
}
void Init(){
cin >> n >> m >> k;
for (int i = k + 1; i <= m + k; ++i){
cin >> a[i].u >> a[i].v >> a[i].w;
}
for (int i = 1; i <= k; ++i){
cin >> a[i].u >> a[i].v;
a[i].w = -inf;
}
for (int i = 1; i <= n; ++i) cin >> p[i];
sort(a + k + 1, a + m + k + 1);
dsu.reset(n + 1);
for (int i = 1; i <= k; ++i){
int u = a[i].u, v = a[i].v;
int x = dsu.find(u), y = dsu.find(v);
if (x != y){
dsu.merge(x, y);
}
}
for (int i = k + 1; i <= m + k; ++i){
int u = a[i].u, v = a[i].v;
int x = dsu.find(u), y = dsu.find(v);
if (x != y){
edge.pb(i);
dsu.merge(x, y);
}
}
dsu.reset(n + 1);
for (const int &i: edge){
int u = a[i].u, v = a[i].v;
int x = dsu.find(u), y = dsu.find(v);
dsu.merge(x, y);
}
for (int i = 1; i <= n; ++i){
int j = dsu.find(i);
if (!id[j]) id[j] = ++node_cnt;
sum[id[i] = id[j]] += p[i];
}
for (int i = 1; i <= k + m; ++i){
a[i].u = id[a[i].u];
a[i].v = id[a[i].v];
}
dsu.reset(node_cnt + 1);
edge.clear();
for (int i = k + 1; i <= k + m; ++i){
int u = a[i].u, v = a[i].v;
int x = dsu.find(u), y = dsu.find(v);
if (x != y){
edge.pb(i);
dsu.merge(x, y);
}
}
for (const int &i: edge) required.pb(a[i]);
ll ans = 0;
for (int i = 1; i < 1 << k; ++i){
ans = max(ans, cal(i));
}
cout << ans;
}
int main(){
if (fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
//freopen(taskname".out", "w", stdout);
}
faster;
ll tt = 1;
//cin >> tt;
while (tt--){
Init();
}
}
Compilation message (stderr)
toll.cpp: In function 'll cal(int)':
toll.cpp:114:9: warning: unused variable 'mophat' [-Wunused-variable]
114 | int mophat = mask;
| ^~~~~~
toll.cpp: In function 'int main()':
toll.cpp:211:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
211 | freopen(taskname".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |