1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; typedef long long ll; typedef pair <int,int> pii; #define DEBUG(x) cout << #x << " = " << x << endl template <typename T> inline bool read(T &x) { int f = 1,c = getchar();x = 0; while (!isdigit(c)) {if (c == 45)f = -1;c = getchar();} while (isdigit(c))x = (x<<3)+(x<<1)+(c^48),c = getchar(); return x *= f,true; } template <typename T,typename... Args> inline bool read(T &x,Args &...args) { return read(x) && read(args...); }
namespace run { const int maxn = 3e5+10,maxm = 3e5+10; const int inf = 1<<30; struct Edge {int nxt,to,w;}edge[maxm<<1]; int begn[maxn],e = 1,cur[maxn]; int dep[maxn]; bool vis[maxn]; int a[maxn],v[maxn]; int ans,n,m,g,s,t; queue<int> q; inline void add(int x,int y,int z) { edge[++e] = (Edge){begn[x],y,z};begn[x] = e; return; } inline void addedge(int x,int y,int z) { add(x,y,z);add(y,x,0); return; } inline bool bfs() { for (register int i = 0;i <= n+m+1;++i)dep[i] = 0x3f3f3f3f,cur[i] = begn[i],vis[i] = false; dep[s] = 0; q.push(s); while (!q.empty()) { int x = q.front(); q.pop(); vis[x] = false; for (register int i = begn[x];i;i = edge[i].nxt) { int y = edge[i].to; if (dep[y] > dep[x]+1 && edge[i].w) { dep[y] = dep[x]+1; if (!vis[y])q.push(y),vis[y] = true; } } } return dep[t] != 0x3f3f3f3f; } bool Flag; inline int dfs(int x,int flow,int &res) { int tflow = 0; if (x == t) { Flag = true; res += flow; return flow; } int used = 0; for (register int i = cur[x];i;i = edge[i].nxt) { cur[x] = i; int y = edge[i].to; if (dep[y] == dep[x]+1 && edge[i].w) if (tflow = dfs(y,min(edge[i].w,flow-used),res)) { used += tflow; edge[i].w -= tflow; edge[i^1].w += tflow; if (used == flow)break; } } return used; } inline int Dinic() { int res = 0,low; while (bfs()) { Flag = true; while (Flag)Flag = false,dfs(s,inf,res); } return res; } inline int main() { read(n,m,g);s = 0;t = n+m+1; for (register int i = 1;i <= n;++i)read(a[i]); for (register int i = 1;i <= n;++i)read(v[i]); for (register int i = 1;i <= n;++i) { if (!a[i])addedge(s,i,v[i]); else addedge(i,t,v[i]); } for (register int i = 1;i <= m;++i) { int b,w,k,p; read(b,w); ans += w; read(k); for (register int j = 1,x;j <= k;++j) { read(x); if (!b)addedge(n+i,x,inf); else addedge(x,n+i,inf); } read(p); if (p)w += g; if (!b)addedge(s,n+i,w); else addedge(n+i,t,w); } printf("%d\n",ans-Dinic()); cerr<<1.0*clock()/CLOCKS_PER_SEC<<endl; return 0; } }
#define demonlover int main() { #ifdef demonlover freopen("CF311E.in","r",stdin); freopen("CF311E.out","w",stdout); #endif return run :: main(); }
|