Submission #4566

#TimeUsernameProblemLanguageResultExecution timeMemory
4566cki86201Toll (APIO13_toll)C++98
78 / 100
2500 ms36544 KiB
#include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<math.h> #include<stdlib.h> #include<set> #include<ctype.h> using namespace std; #define X first #define Y second typedef long long ll; typedef pair<int,int> Pi; // O( 2^K*K^2 + M); const int MV = 100010; const int ME = 600060; int N,M,K; struct UF{ int p[MV],mem[MV]; void init(int x){for(int i=1;i<=x;i++)p[i]=i,mem[i]=1;} int Find(int x){ while(x!=p[x])x=p[x]; return x; } bool Union(int x,int y){ x=Find(x),y=Find(y); if(x==y)return false; if(mem[x]>mem[y])p[y]=x; else p[x]=y; if(mem[x]==mem[y])mem[y]++; return true; } }uf; struct Graph{ int st[MV], en[ME], len[ME], next[ME]; int c; Graph(){c=1;} void init(int x){for(int i=1;i<=x;i++)st[i]=0;c=1;} inline void addedge(int s,int d,int l){++c,next[c]=st[s],st[s]=c,en[c]=d,len[c]=l;} void add(int s,int d,int l){addedge(s,d,l),addedge(d,s,l);} }I,MST,GR,NE; int inp[MV]; int gro[MV]; ll wi[23]; int Ka; int sor[1000010]; ll ans; Pi add[23]; bool cut[MV<<1]; bool check[MV]; void make_mst() { uf.init(N); int i; for(i=1;i<=1000000;i++){ if(sor[i]){ int x=I.en[sor[i]<<1],y=I.en[sor[i]<<1|1]; if(uf.Union(x,y)){ MST.add(x,y,I.len[sor[i]<<1]); } } } } void dfs(int x,int c) { gro[x]=c; wi[c]+=inp[x]; check[x]=1; for(int i=MST.st[x];i;i=MST.next[i]){ if(!check[MST.en[i]]&&!cut[i])dfs(MST.en[i],c); } } void make_mst2() { uf.init(N); int i; for(i=0;i<K;i++)uf.Union(add[i].X,add[i].Y); for(i=1;i<N;i++){ if(!uf.Union(MST.en[i<<1],MST.en[i<<1|1]))cut[i<<1]=cut[i<<1|1]=1; } for(i=1;i<=N;i++)if(!check[i])dfs(i,++Ka); for(i=1;i<N;i++){if(cut[i<<1])GR.add(gro[MST.en[i<<1]],gro[MST.en[i<<1|1]],MST.len[i<<1]);} for(i=0;i<K;i++)add[i].X=gro[add[i].X],add[i].Y=gro[add[i].Y]; } ll wei[22]; int T; bool chk[22]; void bfs(int s,int d,int l) { int Q[22],pre[22],fr=1,re=0,i; for(i=1;i<=Ka;i++)chk[i]=0; Q[0]=s; chk[s]=1; while(fr!=re){ for(i=NE.st[Q[re++]];i;i=NE.next[i]){ int t=NE.en[i]; if(chk[t])continue; Q[fr++]=t; chk[t]=1; pre[t]=i; if(t==d){ int tmp=t; while(tmp!=s){ int u=pre[tmp]; if(NE.len[u]<0)NE.len[u]=NE.len[u^1]=l; tmp=NE.en[u^1]; } return; } } } } ll dfs(int x) { chk[x]=1; wei[x]=wi[x]; ll ret=0; for(int i=NE.st[x];i;i=NE.next[i]){ if(chk[NE.en[i]])continue; int d=NE.en[i]; ret+=dfs(d); wei[x]+=wei[d]; if(i<=T)ret+=wei[d]*NE.len[i]; } return ret; } ll solve(int x) { uf.init(K+1); NE.init(K+1); int i; for(i=0;i<K;i++){ if(x&(1<<i)){ if(!uf.Union(add[i].X,add[i].Y))return -1; NE.add(add[i].X,add[i].Y,-1); } } T=NE.c; for(i=1;i<Ka;i++){ int x=GR.en[i<<1],y=GR.en[i<<1|1]; if(uf.Union(x,y))NE.add(x,y,GR.len[i<<1]); else bfs(x,y,GR.len[i<<1]); } for(i=1;i<=Ka;i++)chk[i]=0; return dfs(1); } int getInt() { ABC: int a=0; char c=getchar(); while(isdigit(c)){ a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } if(a==0)goto ABC; return a; } int main() { N=getInt(),M=getInt(),K=getInt(); int i; for(i=1;i<=M;i++){ int x=getInt(),y=getInt(),z=getInt(); sor[z]=i; I.add(x,y,z); } for(i=0;i<K;i++)add[i].X=getInt(),add[i].Y=getInt(); for(i=1;i<=N;i++)inp[i]=getInt(); make_mst(); make_mst2(); for(i=0;i<(1<<K);i++){ ans=max(ans,solve(i)); } printf("%lld",ans); return 0; }
#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...