BotByte

Noor_dinic.cpp

Apr 30th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define INF 2000000000
  6.  
  7. const int MAX_E=60003;
  8. const int MAX_V=1000;
  9. int ver[MAX_E],cap[MAX_E],nx[MAX_E],last[MAX_V],ds[MAX_V],st[MAX_V],now[MAX_V],edge_count,S,T;
  10.  
  11. inline void reset()
  12. {
  13.     memset(nx,-1,sizeof(nx));
  14.     memset(last,-1,sizeof(last));
  15.     edge_count=0;
  16. }
  17. inline void addedge(const int v,const int w,const int capacity,const int reverse_capacity)
  18. {
  19.     ver[edge_count]=w; cap[edge_count]=capacity; nx[edge_count]=last[v]; last[v]=edge_count++;
  20.     ver[edge_count]=v; cap[edge_count]=reverse_capacity; nx[edge_count]=last[w]; last[w]=edge_count++;
  21. }
  22. inline bool bfs()
  23. {
  24.     memset(ds,-1,sizeof(ds));
  25.     int a,b;
  26.     a=b=0;
  27.     st[0]=T;
  28.     ds[T]=0;
  29.     while (a<=b)
  30.     {
  31.         int v=st[a++];
  32.         for (int w=last[v];w>=0;w=nx[w])
  33.         {
  34.             if (cap[w^1]>0 && ds[ver[w]]==-1)
  35.             {
  36.                 st[++b]=ver[w];
  37.                 ds[ver[w]]=ds[v]+1;
  38.             }
  39.         }
  40.     }
  41.     return ds[S]>=0;
  42. }
  43. int dfs(int v,int cur)
  44. {
  45.     if (v==T) return cur;
  46.     for (int &w=now[v];w>=0;w=nx[w])
  47.     {
  48.         if (cap[w]>0 && ds[ver[w]]==ds[v]-1)
  49.         {
  50.             int d=dfs(ver[w],min(cur,cap[w]));
  51.             if (d)
  52.             {
  53.                 cap[w]-=d;
  54.                 cap[w^1]+=d;
  55.                 return d;
  56.             }
  57.         }
  58.     }
  59.     return 0;
  60. }
  61. inline int dinic()
  62. {
  63.     int res=0;
  64.     while (bfs())
  65.     {
  66.         for (int i=0;i<MAX_V;i++) now[i]=last[i];
  67.         while (1)
  68.         {
  69.             int tf=dfs(S,INF);
  70.             res+=tf;
  71.             if (!tf) break;
  72.         }
  73.     }
  74.     return res;
  75. }
  76.  
  77.  
  78. int main()
  79. {
  80.     //freopen("input.txt","r",stdin);
  81.     int cases;
  82.     scanf("%d", &cases);
  83.     int caseno = 0;
  84.     while(cases--){
  85.         reset();
  86.         int n;
  87.         scanf("%d", &n);
  88.         int arr[n+1];
  89.         for(int i=1; i<=n; i++){
  90.             scanf("%d", &arr[i]);
  91.             addedge(i, i+n, arr[i], 0);
  92.             //cout << i << " " << i+n << " " << arr[i] << endl;
  93.         }
  94.         int m;
  95.         scanf("%d", &m);
  96.         for(int i=0; i<m; i++){
  97.             int u, v, c;
  98.             scanf("%d %d %d", &u, &v, &c);
  99.             u = u+n;
  100.             addedge(u, v, c, 0);
  101.             //cout << u << " " << v << " " << c << endl;
  102.         }
  103.         int b, d;
  104.         scanf("%d %d", &b, &d);
  105.         for(int i=0; i<b; i++){
  106.             int val;
  107.             scanf("%d", &val);
  108.             addedge(0, val, 10000, 0);
  109.             //cout << 0 << " " << val << " " << 10000 << endl;
  110.         }
  111.         for(int i=0; i<d; i++){
  112.             int val;
  113.             scanf("%d", &val);
  114.             addedge(val+n, 2*n+1, 10000, 0);
  115.             //cout << val << " " << 2*n+1 << " " << 10000 << endl;
  116.         }
  117.         S = 0, T = 2*n+1;
  118.         printf("Case %d: %d\n", ++caseno, dinic());
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment