Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=10005;
- const int M=100005;
- const int INF=(1ull<<31)-1;
- namespace Dinic{
- int n,s,t,ecnt=1;
- int fir[N],cur[N],dep[N],nex[M<<1],to[M<<1],w[M<<1];
- inline void addedge(int u,int v,int c){
- nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
- nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=0;
- }
- inline bool bfs(){
- memset(dep,0,n<<2);
- memcpy(cur,fir,n<<2);
- dep[s]=1;
- queue<int>Q;
- Q.push(s);
- while(!Q.empty()){
- int x=Q.front();
- Q.pop();
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(dep[v]||!w[i])continue;
- dep[v]=dep[x]+1;
- if(v==t)return 1;
- Q.push(v);
- }
- }
- return 0;
- }
- int dfs(int x,int lim){
- if(x==t||!lim)return lim;
- int flow=0;
- for(int &i=cur[x],f;i&&lim;i=nex[i]){
- int v=to[i];
- if((dep[v]==dep[x]+1)&&(f=dfs(v,min(lim,w[i])))){
- if(f){
- w[i]-=f;
- w[i^1]+=f;
- flow+=f;
- lim-=f;
- }
- }
- }
- return flow;
- }
- inline int dinic(){
- int Ans=0;
- while(bfs()){
- Ans+=dfs(s,INF);
- }
- return Ans;
- }
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- int sum=0;
- int n;r(n);
- Dinic::t=0;
- for(int i=1;i<=n;++i){
- int v,f;r(v),r(f);
- Dinic::addedge(i,Dinic::t,v);
- sum+=v*f;
- }
- int m;r(m);
- Dinic::s=n+m+1;
- Dinic::n=n+m+2;
- for(int i=n+1;i<=n+m;++i){
- int c,v;r(c),r(v);
- Dinic::addedge(Dinic::s,i,v);
- for(int j=1;j<=c;++j){
- int x;r(x);
- Dinic::addedge(i,x,INF);
- }
- sum+=v;
- }
- printf("%d\n",sum-Dinic::dinic());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement