poj1149 pigs

传送门

看成猪在人手上流动, 源点向第一个有每个猪圈钥匙的人连猪圈里的猪的边,每个人向,对于他有的每把钥匙,下一个有这把钥匙的人连inf的边,每个人向汇点连能买的猪的边。

一直秒T调了半天发现读入T了,把n写成m了。。。

  1 //Achen
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<vector>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<cmath>
 10 #include<set>
 11 #include<map>
 12 #define Formylove return 0
 13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
 14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
 15 const int N=400007;
 16 typedef long long LL;
 17 typedef double db;
 18 using namespace std;
 19 int n,m,a[N];
 20 int lasthave[N];
 21 
 22 template<typename T>void read(T &x)  {
 23     char ch=getchar(); x=0; T f=1;
 24     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
 25     if(ch=='-') f=-1,ch=getchar();
 26     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
 27 }
 28 
 29 struct edge {
 30     int u,v,cap,fl,nx;
 31     edge(){}
 32     edge(int u,int v,int cap,int fl,int nx):u(u),v(v),cap(cap),fl(fl),nx(nx){} 
 33 }e[N];
 34 
 35 int ecnt=1,fir[N];
 36 void add(int u,int v,int cap) {
 37     e[++ecnt]=edge(u,v,cap,0,fir[u]); fir[u]=ecnt;
 38     //printf("%d->%d:%d\n",u,v,cap);
 39     e[++ecnt]=edge(v,u,0,0,fir[v]); fir[v]=ecnt;
 40 }
 41 
 42 queue<int>que;
 43 int d[N];
 44 void bfs(int s,int t) {
 45     que.push(t);
 46     For(i,1,n) d[i]=n;
 47     d[t]=0;
 48     while(!que.empty()) {
 49         int x=que.front();
 50         que.pop();
 51         for(int i=fir[x];i;i=e[i].nx) {
 52             int y=e[i].v;
 53             if(d[y]==n&&e[i].cap==0) {
 54                 d[y]=d[x]+1;
 55                 que.push(y); 
 56             }
 57         }
 58     }
 59 }
 60 
 61 #define inf 1e9
 62 int p[N];
 63 int calc(int s,int t) {
 64     int fl=inf;
 65     for(int i=t;i!=s;i=e[p[i]].u)
 66         fl=min(fl,e[p[i]].cap-e[p[i]].fl);
 67     for(int i=t;i!=s;i=e[p[i]].u) 
 68         e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
 69     return fl;
 70 }
 71 
 72 int c[N],cur[N];
 73 int isap(int s,int t) {
 74     For(i,0,n) c[i]=0;
 75     bfs(s,t);
 76     For(i,1,n) cur[i]=fir[i],c[d[i]]++;
 77     int rs=0;
 78     for(int x=s;d[x]<n;) {
 79         if(x==t) {
 80             rs+=calc(s,t);
 81             x=s;
 82         }
 83         int ok=0;
 84         for(int &i=cur[x];i;i=e[i].nx) if(e[i].cap>e[i].fl&&d[e[i].v]+1==d[x]) {
 85             ok=1; p[x=e[i].v]=i; break;
 86         }
 87         if(!ok) {
 88             int D=n; cur[x]=fir[x];
 89             for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl)
 90                 D=min(D,d[e[i].v]+1);
 91             if(!(--c[d[x]])) break; 
 92             c[d[x]=D]++;
 93             if(x!=s) x=e[p[x]].u;
 94         }
 95     }
 96     return rs;
 97 }
 98 
 99 int main() {
100 #ifdef ANS
101     freopen(".in","r",stdin);
102     freopen(".out","w",stdout);
103 #endif
104     read(m); read(n);
105     For(i,1,m) read(a[i]); 
106     int s=n+1,t=n+2; n+=2;
107     For(i,1,n-2) {
108         int k,tot,infl=0;
109         read(k);
110         For(j,1,k) {
111             int id;
112             read(id);
113             if(!lasthave[id]) infl+=a[id];
114             else add(lasthave[id],i,inf);
115             lasthave[id]=i;
116         }
117         read(tot);
118         if(infl) add(s,i,infl);
119         add(i,t,tot);
120     }
121     int ans=isap(s,t);
122     printf("%d\n",ans);
123     Formylove;
124 }
View Code

 

posted @ 2018-08-27 15:36  啊宸  阅读(133)  评论(0编辑  收藏  举报