a53

Dyson_5p

a53
Sep 20th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. /// https://codeforces.com/problemset/problem/1383/F
  2. #include<bits/stdc++.h>
  3. #define F first
  4. #define S second
  5. #define PB push_back
  6. #define sz(s) int((s).size())
  7. #define bit(n,k) (((n)>>(k))&1)
  8. using namespace std;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11. const int maxn=2e4+10,mod=1e9+7,inf=1e9+10;
  12.  
  13. struct Flow
  14. {
  15. int cap[maxn];
  16. int mark[maxn],colo=0,h[maxn],pp[maxn],to[maxn],tp[maxn],nxt[maxn],qu[maxn],C = 0;
  17. Flow()
  18. {
  19. memset(tp,-1,sizeof tp);
  20. }
  21. void add_edge(int a,int b,int c)
  22. {
  23. nxt[C]=tp[a],cap[C]=c,to[C]=b,tp[a]=C;
  24. ++C;
  25. nxt[C]=tp[b],cap[C]=0,to[C]=a,tp[b]=C;
  26. ++C;
  27. }
  28. bool bfs(int src,int snk)
  29. {
  30. memset(h,-1,sizeof h);
  31. int L=0,R=1;
  32. qu[0]=src;
  33. h[src]=0;
  34. while(L<R)
  35. {
  36. int u=qu[L++];
  37. if(u==snk)
  38. return 1;
  39. for(int id=tp[u];id!=-1;id=nxt[id])
  40. if(h[to[id]]==-1&&cap[id]!=0)
  41. h[to[id]]=1+h[u],qu[R++]=to[id];
  42. }
  43. return 0;
  44. }
  45. int dfs(int u,int snk,int f)
  46. {
  47. if(u==snk)
  48. return f;
  49. int ans=0;
  50. while(pp[u]!=-1)
  51. {
  52. int id=pp[u];
  53. if(cap[id]!= 0&&h[u]+1==h[to[id]])
  54. {
  55. int num=dfs(to[id],snk,min(f-ans,cap[id]));
  56. ans+=num;
  57. cap[id]-=num,cap[id^1]+=num;
  58. if(ans==f)
  59. break;
  60. }
  61. pp[u]=nxt[pp[u]];
  62. }
  63. return ans;
  64. }
  65. int flow(int src,int snk)
  66. {
  67. int ans=0;
  68. while(bfs(src,snk))
  69. {
  70. memcpy(pp,tp,sizeof tp);
  71. ans+=dfs(src,snk,inf);
  72. }
  73. return ans;
  74. }
  75. int FLW[maxn],pr[maxn];
  76. int bfs2(int src,int snk)
  77. {
  78. int L=0,R=1;
  79. mark[src]=colo;
  80. qu[0]=src;
  81. FLW[src]=inf;
  82. while(L<R&&mark[snk]!=colo)
  83. {
  84. int u=qu[L++];
  85. for(int id=tp[u];id!=-1;id=nxt[id])
  86. {
  87. int y=to[id];
  88. if(mark[y]!=colo&&cap[id]!= 0)
  89. {
  90. mark[y]=colo,FLW[y]=min(FLW[u],cap[id]),pr[y]=id,qu[R++]=y;
  91. if(y==snk)
  92. break;
  93. }
  94. }
  95. }
  96. if(mark[snk]!=colo)
  97. return 0;
  98. int ans=FLW[snk];
  99. while(snk!=src)
  100. {
  101. int id=pr[snk];
  102. cap[id]-=ans,cap[id^1]+=ans;
  103. snk=to[id^1];
  104. }
  105. return ans;
  106. }
  107. int dfs2(int u,int snk,int f)
  108. {
  109. mark[u]=colo;
  110. if(u==snk)
  111. return f;
  112. for(int id=tp[u];id!=-1;id=nxt[id])
  113. {
  114. if(cap[id]==0||mark[to[id]]==colo)
  115. continue;
  116. int num=dfs2(to[id],snk,min(f,cap[id]));
  117. if(num!=0)
  118. {
  119. cap[id]-=num,cap[id^1]+=num;
  120. return num;
  121. }
  122. }
  123. return 0;
  124. }
  125. int flow2(int src,int snk)
  126. {
  127. int ans=0;
  128. while(true)
  129. {
  130. ++colo;
  131. int num=bfs2(src,snk);
  132. if(num==0)
  133. break;
  134. ans+=num;
  135. }
  136. return ans;
  137. }
  138. };
  139.  
  140. const int maxk=10,MAX=25;
  141. int ANS[(1<<maxk)+10],n,k;
  142. Flow flw;
  143. int CAP[maxk][maxn];
  144.  
  145. void go(int pos,int msk,int F)
  146. {
  147. if(pos==k)
  148. {
  149. ANS[msk]=F;
  150. return;
  151. }
  152. memcpy(CAP[pos],flw.cap,sizeof CAP[pos]);
  153. go(pos+1,msk, F);
  154. flw.cap[2*pos]=MAX;
  155. go(pos+1,msk^(1<<pos),F+flw.flow2(0,n-1));
  156. memcpy(flw.cap,CAP[pos],sizeof CAP[pos]);
  157. }
  158.  
  159. int arr[maxk],sm[1<<maxk];
  160. int main()
  161. {
  162. ifstream fin("dyson.in");
  163. int m,q;
  164. fin>>n>>m>>k>>q;
  165. for(int i=0;i<m;++i)
  166. {
  167. int a,b,c;
  168. fin>>a>>b>>c;
  169. --a,--b;
  170. flw.add_edge(a,b,c);
  171. }
  172. int F=flw.flow(0,n-1);
  173. go(0,0,F);
  174. ofstream fout("dyson.out");
  175. while(q--)
  176. {
  177. for(int i=0;i<k;++i)
  178. fin>>arr[i];
  179. int ans=inf;
  180. for(int msk=0;msk<(1<<k); ++msk)
  181. {
  182. if(msk==0)
  183. sm[msk]=0;
  184. else
  185. sm[msk]=arr[ __builtin_ctz(msk)]+sm[msk-(msk&-msk)];
  186. ans=min(ans,sm[msk]+ANS[((1<<k)-1)^msk ]);
  187. }
  188. fout<<ans<<'\n';
  189. }
  190. return 0;
  191. }
  192.  
Add Comment
Please, Sign In to add comment