#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int , int> pii;
const int maxN = int(1e5)+7;
const int maxM = int(3e5)+7;
const int maxK = 30;
struct edge{
int u , v , w;
edge(){};
edge(int _u , int _v , int _w){
u = _u; v = _v; w = _w;
}
bool operator < (const edge& other) const{
return w < other.w;
}
};
struct DSU{
int n , fa[maxN];
void init(int _n){
n = _n;
for (int i = 0 ; i <= n ; i++) fa[i] = -1;
}
int root(int x){
if (fa[x] < 0) return x; else return fa[x] = root(fa[x]);
}
void unite(int u , int v){
u = root(u);
v = root(v);
if (u == v) return;
if (-fa[u] < -fa[v]) swap(u , v);
fa[u] += fa[v];
fa[v] = u;
}
} dsu;
int n , m , k , p[maxN];
edge E[maxM];
vector<pii> g[maxN];
pii greedy[maxK];
int del[maxK];
int get(int u , int par , int en){
for (pii e : g[u]){
int v = e.first;
int id = e.second;
if (v == par) continue;
if (v == en) return id;
int tmp = get(v , u , en);
if (tmp != -1) return max(tmp , id);
}
return -1;
}
bool del_edge[maxM];
ll cost[maxN] , sz[maxN];
vector<pii> adj[maxK];
int pos[maxN];
bool ok[maxK] , vis[maxK];
void dfs(int u , ll &ans){
sz[u] = cost[u];
vis[u] = true;
for (pii e : adj[u]){
int v = e.first;
int id = e.second;
int w = E[del[id]].w;
if (vis[v]) continue;
dfs(v , ans);
if (ok[id]) ans += 1ll * sz[v] * w;
sz[u] += sz[v];
}
}
void solve(){
cin >> n >> m >> k;
for (int i = 1 ; i <= m ; i++){
int u , v , w;
cin >> u >> v >> w;
E[i] = edge(u , v , w);
}
sort(E + 1 , E + m + 1);
dsu.init(n);
for (int i = 1 ; i <= m ; i++){
int u = E[i].u;
int v = E[i].v;
int w = E[i].w;
if (dsu.root(u) != dsu.root(v)){
dsu.unite(u , v);
g[u].push_back({v , i});
g[v].push_back({u , i});
}
else{
del_edge[i] = 1;
}
}
for (int i = 0 ; i < k ; i++){
int u , v;
cin >> u >> v;
greedy[i] = {u , v};
del[i] = get(u , 0 , v);
del_edge[del[i]] = 1;
}
dsu.init(n);
for (int i = 1 ; i <= m ; i++){
if (del_edge[i] == 1) continue;
int u = E[i].u;
int v = E[i].v;
dsu.unite(u , v);
}
for (int i = 1 ; i <= n ; i++) cin >> p[i];
int num_ver = 0;
vector<int> ver;
for (int i = 1 ; i <= n ; i++){
if (dsu.root(i) == i){
pos[i] = num_ver++;
ver.push_back(i);
}
}
for (int i = 1 ; i <= n ; i++){
cost[pos[dsu.root(i)]] += 1ll * p[i];
}
ll ans = 0;
for (int mask = 0 ; mask < (1<<k) ; mask++){
for (int i = 0 ; i < num_ver ; i++){
adj[i].clear(); vis[i] = ok[i] = false;
}
dsu.init(num_ver);
for (int i = 0 ; i < k ; i++){
int u = ((mask>>i)&1) ? greedy[i].first : E[del[i]].u;
int v = ((mask>>i)&1) ? greedy[i].second : E[del[i]].v;
u = pos[dsu.root(u)];
v = pos[dsu.root(v)];
dsu.unite(u , v);
adj[u].push_back({v , i});
adj[v].push_back({u , i});
ok[i] = ((mask>>i)&1);
}
bool is_tree = (-dsu.fa[dsu.root(0)] == num_ver);
if (is_tree){
ll cur_ans = 0;
dfs(pos[dsu.root(1)] , cur_ans);
ans = max(ans , cur_ans);
}
}
cout << ans << "\n";
}
int main(){
if (fopen("D.inp" , "r")){
freopen("D.inp" , "r" , stdin);
freopen("D.out" , "w" , stdout);
}
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int numTest = 1; //cin >> numTest;
while (numTest--) solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
toll.cpp: In function 'int main()':
toll.cpp:163:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
163 | freopen("D.inp" , "r" , stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:164:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
164 | freopen("D.out" , "w" , stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |