标签:
orz出题人云神
选A的代价就是失去B的利润,这就容易相出是最大权闭合子图
用了ISAP(感谢林教主提供简洁的模板orz),dinic居然这么龟速!!不过d数组的含义还不太清楚(貌似是分层?
官方题解
1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) for(edge *j=h[x];j;j=j->next) 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define inf 1e9 7 #define ll long long 8 #define succ(x) (1<<x) 9 #define NM 4000 10 #define nm 4000000 11 using namespace std; 12 int read(){ 13 int x=0,f=1;char ch=getchar(); 14 while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();} 15 while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar(); 16 return x*f; 17 } 18 struct edge{ 19 int t,v; 20 edge *next,*rev; 21 }e[nm],*h[NM],*o=e,*p[NM],*tmp[NM]; 22 void _add(int x,int y,int v){ 23 o->t=y;o->v=v;o->next=h[x];h[x]=o;o++; 24 } 25 void add(int x,int y,int v){ 26 _add(x,y,v);_add(y,x,0); 27 h[x]->rev=h[y];h[y]->rev=h[x]; 28 } 29 int n,m,_x,_t,d[NM],ans,v,cnt[NM]; 30 queue<int >q; 31 int maxflow(){ 32 int flow=0;edge *j; 33 inc(i,1,n)tmp[i]=h[i]; 34 cnt[0]=v; 35 for(int x=0,s=inf;d[x]<v;){ 36 for(j=tmp[x];j;j=j->next) 37 if(j->v&&d[j->t]+1==d[x])break; 38 if(j){ 39 s=min(s,j->v);tmp[x]=p[j->t]=j; 40 if((x=j->t)==n){ 41 for(;x!=0;x=p[x]->rev->t){ 42 p[x]->v-=s; 43 p[x]->rev->v+=s; 44 } 45 flow+=s;s=inf; 46 } 47 }else{ 48 if(!--cnt[d[x]])break; 49 d[x]=v; 50 link(x) 51 if(j->v&&d[j->t]+1<d[x]){ 52 d[x]=d[j->t]+1; 53 tmp[x]=j; 54 } 55 cnt[d[x]]++; 56 if(x!=0)x=p[x]->rev->t; 57 } 58 } 59 return flow; 60 } 61 int main(){ 62 // freopen("data.in","r",stdin); 63 n=read(); 64 inc(i,1,n){ 65 _t=read();ans+=_t;add(0,i,_t); 66 } 67 inc(i,1,n){ 68 _t=read();ans+=_t;add(i,n+1,_t); 69 } 70 m=read();n++;v=n; 71 while(m--){ 72 _t=read();v++; 73 _x=read();ans+=_x;add(0,v,_x); 74 _x=read();ans+=_x;add(v+1,n,_x); 75 inc(j,1,_t){ 76 _x=read(); 77 add(v,_x,inf);add(_x,v+1,inf); 78 } 79 v++; 80 } 81 v++; 82 printf("%d\n",ans-maxflow()); 83 return 0; 84 }
标签:
原文地址:http://www.cnblogs.com/onlyRP/p/5095493.html