Submission #1349090

#TimeUsernameProblemLanguageResultExecution timeMemory
1349090mikasaToll (APIO13_toll)C++20
16 / 100
0 ms344 KiB
#include<bits/stdc++.h>
using namespace std;
#define debug(n,m) cout<<"["<<#n<<"]->"<<n<<m
#define int long long
#define all(x,off) x.begin()+off,x.end()
#define pb push_back 

const int N=1e6+10;
const int inf=9e17;
const int mod=1e9+7;

vector<int> g[1001];

vector<int>tr[1001];

vector<array<int,3>> ed;

int cur[1001][1001];

int p[1001];

int n,m,k;
int l[11];
int r[11];

int dfs(int u,int par) {
  int tot=0;
  for (int v : tr[u]) {
    if (v==par) continue;
    cur[u][v]=cur[v][u]=dfs(v,u);
    tot+=cur[u][v];
  } 
  return tot+p[u];
}

struct DSU {
  vector<int> p,sz;
  void init(int n) {
    p.assign(n+1,0);
    sz.assign(n+1,0);
    for (int i=1;i<=n;++i) p[i]=i,sz[i]=1;
  }
  
  int lead(int v) {
    return (p[v]==v)?v:p[v]=lead(p[v]);
  }
  void unite(int a,int b) {
    a=lead(a);
    b=lead(b);
    if (a==b) return;
    if (sz[a]>sz[b]) swap(a,b);
    sz[b]+=sz[a];
    sz[a]=0;
    p[a]=b;
  }
  bool same(int a,int b) {
    return lead(a)==lead(b);
  } 
};

int solve_sub3() {
  DSU ds;
  ds.init(n);
  int tot=0;
  for (auto &[w,u,v]:ed) {
    if (ds.same(u,v))continue;
      tot+=w;
      ds.unite(u,v);
    
  }
  ds.init(n);
  int res=0;
  for (int mask=1;mask<(1<<k);++mask) {
    for (int i=1;i<=n;++i) tr[i].clear();
    bool cn=true;
    for (int j=0;j<k;++j) {
      if (mask&(1<<j)) {
        if (ds.same(l[j+1],r[j+1])) {
          cn=false;
          break;
        }
        ds.unite(l[j+1],r[j+1]);
        tr[l[j+1]].pb(r[j+1]);
        tr[r[j+1]].pb(l[j+1]);
      }
    }
    if (!cn) continue;
    for (auto &[w,u,v]:ed) {
      if (!ds.same(u,v)) {
        tot-=w;
        tr[u].pb(v);
        tr[v].pb(u);
        ds.unite(u,v);
      }
    }
    if (tot<=0) continue;
    dfs(1,0);
    int cur=0;
    for (int j=0;j<k;++j) {
      if (mask&(1<<j)) cur=max(cur,::cur[l[j+1]][r[j+1]]);
    }
    res=max(res,cur*tot);
  }
  return res;
}

void levi() {
  cin>>n>>m>>k;
  for (int i=1;i<=m;++i) {
    int u,v,w;
    cin>>u>>v>>w;
    g[u].pb(v);
    g[v].pb(u);
    ed.pb({w,u,v});
  }
  for (int i=1;i<=k;++i) cin>>l[i]>>r[i];
  for (int i=1;i<=n;++i) cin>>p[i];
  // g[l].pb(r);
  // g[r].pb(l);
  sort(begin(ed),end(ed));
  int res=solve_sub3();
  // for (int i=1;i<=(int)1e6;++i) {
  //   for (int i=1;i<=n;++i) tr[i].clear();
  // } 
  cout<<res<<'\n';
}

int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);int tt=1;//cin>>tt;
  while (tt--) levi();
}

/*


*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...