zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",ans);
    123     Formylove;
    124 }
    View Code
  • 相关阅读:
    Docker安装Zookeeper并进行操作
    JVM 完整深入解析
    synchronized关键字加到static静态方法和非static静态方法区别
    submit与execute区别
    ThreadPoolTaskExecutor和ThreadPoolExecutor区别
    Redis占用内存大小
    Java中CycliBarriar和CountdownLatch区别
    Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
    文本格式
    JavaScript事件
  • 原文地址:https://www.cnblogs.com/Achenchen/p/9542568.html
Copyright © 2011-2022 走看看