Submission #417377

#TimeUsernameProblemLanguageResultExecution timeMemory
417377kshitij_sodaniToll (APIO13_toll)C++14
16 / 100
158 ms163844 KiB
//#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second #define endl '\n' int t; int par[1000001]; int par2[1000001]; vector<int> adj[1000001]; int it[1000001]; int find(int no){ if(par[no]==no){ return par[no]; } par[no]=find(par[no]); return par[no]; } int co=0; int st[1000001]; int endd[1000001]; llo ss[100001]; llo val[100001]; //int par2[100001]; void dfs(int no,int par=-1){ st[no]=co; co++; par2[no]=par; ss[no]=it[no]; for(auto j:adj[no]){ if(j!=par){ dfs(j,no); ss[no]+=ss[j]; } } endd[no]=co-1; } bool ispar(int x,int y){ return st[x]<=st[y] and endd[x]>=endd[y]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n,m,k; cin>>n>>m>>k; vector<pair<int,pair<int,int>>> ed; for(int i=0;i<m;i++){ int aa,bb,cc; cin>>aa>>bb>>cc; aa--; bb--; ed.pb({cc,{aa,bb}}); } sort(ed.begin(),ed.end()); vector<pair<int,int>> zz; for(int i=0;i<k;i++){ int aa,bb; cin>>aa>>bb; aa--; bb--; zz.pb({aa,bb}); } for(int i=0;i<n;i++){ cin>>it[i]; } llo ans=0; vector<pair<int,pair<int,int>>> dd; for(int i=1;i<(1<<k);i++){ for(int j=0;j<n;j++){ par[j]=j; adj[i].clear(); } int st=1; for(int j=0;j<k;j++){ if((1<<j)&i){ int x=find(zz[j].a); int y=find(zz[j].b); if(x==y){ st=0; break; } par[x]=y; adj[zz[j].a].pb(zz[j].b); adj[zz[j].b].pb(zz[j].a); } } if(st==0){ continue; } dd.clear(); for(auto j:ed){ int x=find(j.b.a); int y=find(j.b.b); if(x!=y){ par[x]=y; adj[j.b.a].pb(j.b.b); adj[j.b.b].pb(j.b.a); } else{ dd.pb(j); } } //continue; co=0; dfs(0); for(int j=0;j<n;j++){ par[j]=par2[j]; val[j]=1e9; } //continue; for(auto j:dd){ int x=j.b.a;//find(j.b.a); int y=j.b.b;//find(j.b.b); int cur=x; vector<int> xx; //continue; if(!ispar(x,y)){ while(!ispar(cur,y)){ xx.pb(cur); //cout<<cur<<","; cur=par[cur]; } //cout<<endl; } for(int ii=0;ii<xx.size();ii++){ val[xx[ii]]=min(val[xx[ii]],(llo)j.a); par[xx[ii]]=cur; } cur=y; xx.clear(); if(!ispar(y,x)){ while(!ispar(cur,x)){ xx.pb(cur); cur=par[cur]; } } for(int ii=0;ii<xx.size();ii++){ val[xx[ii]]=min(val[xx[ii]],(llo)j.a); par[xx[ii]]=cur; } } llo su=0; for(int j=0;j<k;j++){ if((1<<j)&i){ if(ispar(zz[j].a,zz[j].b)){ su+=ss[zz[j].b]*val[zz[j].b]; } else{ su+=ss[zz[j].a]*val[zz[j].a]; } } } ans=max(ans,su); } cout<<ans<<endl; return 0; }

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:133:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |    for(int ii=0;ii<xx.size();ii++){
      |                 ~~^~~~~~~~~~
toll.cpp:145:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |    for(int ii=0;ii<xx.size();ii++){
      |                 ~~^~~~~~~~~~
#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...