码迷,mamicode.com
首页 > 其他好文 > 详细

网络流24题 洛谷 2763 试题库问题

时间:2018-04-29 11:56:40      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:syn   i++   网络   code   create   bool   include   pre   ret   

代码风格迥异 ……

技术分享图片
#include<bits/stdc++.h>

const int N=1000+4,M=1000000+10,K=30+5;

using namespace std;

queue<int> q;

int head[M],flt[M],nxt[M],to[M],cn=1;
int ans[K][N],dis[N],num[K];
int n,k,x,tmp,src,sink,inf=1e8+7;
bool vis[N];

int minx(int a,int b){
    return a < b ? a : b ;
}

void create(int u,int v,int f){
    
    cn++;
    to[cn]=v;
    flt[cn]=f;
    nxt[cn]=head[u];
    head[u]=cn;
    
    cn++;
    to[cn]=u;
    flt[cn]=0;
    nxt[cn]=head[v];
    head[v]=cn;
    
}

bool bfs(){
    int v;
    memset(dis,0,sizeof(dis));
    memset(vis,false,sizeof(vis));
    
    q.push(src);
    vis[src]=true;
    
    while(!q.empty()){
        tmp=q.front();
        for(int i=head[tmp];i;i=nxt[i]){
            v=to[i];
            if(flt[i] && !vis[v]){
                dis[v]=dis[tmp]+1;
                q.push(v);
                vis[v]=true;
            }
        }
        q.pop();
    }
    
    return dis[sink]>0;
}

int dinic(int u,int delta){
    if(u==sink) return delta;
    int res=0,v;
    for(int i=head[u];i && delta;i=nxt[i]){
        v=to[i];
        if(flt[i] && dis[v]==dis[u]+1){
            int dd=dinic(v,minx(flt[i],delta));
            flt[i]-=dd;
            delta-=dd;
            flt[i^1]+=dd;
            res+=dd;
        }
    }
    return res;
}

int main(){
    ios::sync_with_stdio(false);
    
    cin>>k>>n;
    for(int i=1+n;i<=k+n;i++)
        cin>>num[i];
    
    src=0;sink=k+n+1;
    
    for(int i=1;i<=n;i++)
        create(src,i,1);
    
    for(int i=1;i<=n;i++){
        cin>>x;
        for(int j=1;j<=x;j++){
            cin>>tmp;
            create(i,tmp+n,1);
        }
    }
    
    for(int i=n+1;i<=n+k;i++)
        create(i,sink,num[i]);
    
    while(bfs())
        dinic(src,inf);
    
    for(int i=1;i<=n;i++){
        for(int j=head[i];j;j=nxt[j]){
            int v=to[j];
            if(!flt[j])
                ans[v][++ans[v][0]]=i;
        }
    }
    
    for(int i=1;i<=k;i++){
        cout<<i<<": ";
        for(int j=1;j<=ans[i+n][0];j++)
            cout<<ans[i+n][j]<<" ";
        cout<<endl;
    }
    
    return 0;
}
Ans

网络流24题 洛谷 2763 试题库问题

标签:syn   i++   网络   code   create   bool   include   pre   ret   

原文地址:https://www.cnblogs.com/horsepower2001/p/8970355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!