POJ 3436 ACM Computer Factory

來源:互聯網
上載者:User

標籤:

最大流+拆點

#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<vector>#include<queue>#include<algorithm>using namespace std;const int maxn = 2000 + 10;const int INF = 0x7FFFFFFF;struct Edge{    int from, to, cap, flow;    Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f) {}};vector<Edge>edges;vector<int>G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];int n, m, s, t;void init(){    for (int i = 0; i < maxn; i++) G[i].clear();    edges.clear();}void AddEdge(int from, int to, int cap){    edges.push_back(Edge(from, to, cap, 0));    edges.push_back(Edge(to, from, 0, 0));    int w = edges.size();    G[from].push_back(w - 2);    G[to].push_back(w - 1);}bool BFS(){    memset(vis, 0, sizeof(vis));    queue<int>Q;    Q.push(s);    d[s] = 0;    vis[s] = 1;    while (!Q.empty())    {        int x = Q.front();        Q.pop();        for (int i = 0; i<G[x].size(); i++)        {            Edge e = edges[G[x][i]];            if (!vis[e.to] && e.cap>e.flow)            {                vis[e.to] = 1;                d[e.to] = d[x] + 1;                Q.push(e.to);            }        }    }    return vis[t];}int DFS(int x, int a){    if (x == t || a == 0)        return a;    int flow = 0, f;    for (int &i = cur[x]; i<G[x].size(); i++)    {        Edge e = edges[G[x][i]];        if (d[x]+1 == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)        {            edges[G[x][i]].flow+=f;            edges[G[x][i] ^ 1].flow-=f;            flow+=f;            a-=f;            if(a==0) break;        }    }    if(!flow) d[x] = -1;    return flow;}int dinic(int s, int t){    int flow = 0;    while (BFS())    {        memset(cur, 0, sizeof(cur));        flow += DFS(s, INF);    }    return flow;}int P,N;int Q[maxn],S[maxn][maxn],D[maxn][maxn];struct ANS{    int a,b,c;};vector<ANS>A;bool ok(int a,int b){    for(int i=1; i<=P; i++)    {        if(S[b][i]==0&&D[a][i]==1) return false;        if(S[b][i]==1&&D[a][i]==0) return false;    }    return true;}int main(){    while(~scanf("%d%d",&P,&N))    {        init();        s=0;        t=N+N+1;        for(int i=1; i<=N; i++)        {            scanf("%d",&Q[i]);            for(int j=1; j<=P; j++) scanf("%d",&S[i][j]);            for(int j=1; j<=P; j++) scanf("%d",&D[i][j]);        }        for(int i=1; i<=N; i++) AddEdge(i,i+N,Q[i]);        for(int i=1; i<=N; i++)        {            int j;            for(j=1; j<=P; j++) if(S[i][j]==1) break;            if(j==P+1) AddEdge(s,i,INF);        }        for(int i=1; i<=N; i++)        {            int j;            for(j=1; j<=P; j++) if(D[i][j]==0) break;            if(j==P+1) AddEdge(i+N,t,INF);        }        for(int i=1; i<=N; i++)            for(int j=1; j<=N; j++)                if(ok(i,j))                    AddEdge(i+N,j,INF);                            int Ans=dinic(s,t);        printf("%d",Ans);        A.clear();        for(int i=0; i<edges.size(); i=i+2)            if(edges[i].from>=N+1&&edges[i].from<=N+N)                if(edges[i].to>=1&&edges[i].to<=N)                    if(edges[i].flow!=0)                    {                        ANS e;                        e.a=edges[i].from-N;                        e.b=edges[i].to;                        e.c=edges[i].flow;                        A.push_back(e);                    }        printf(" %d\n",A.size());        for(int i=0; i<A.size(); i++)            printf("%d %d %d\n",A[i].a,A[i].b,A[i].c);    }    return 0;}

 

POJ 3436 ACM Computer Factory

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.