zoukankan      html  css  js  c++  java
  • 「网络流 24 题」试题库

    #include<bits/stdc++.h>
    using namespace std;
    
    int k,n;
    int tot=-1,h[3005],ans=0,sum=0;
    struct node{
        int from,next,to,rest,full;
    }e[100005];
    void add(int x,int y,int z){
        tot++;
        e[tot].next=h[x];
        h[x]=tot;
        e[tot].from=x;
        e[tot].to=y;
        e[tot].rest=z;
        e[tot].full=z;
    }
    
    int dis[3005],g[3005],flow[3005];
    bool vis[3005];
    
    int bfs(int s,int t){
        queue<int>q;
        dis[s]=0;
        q.push(s);vis[s]=true;
        while(!q.empty()){
            int u=q.front();vis[u]=false;q.pop();
            for(int i=h[u];i!=(-1);i=e[i].next){
                if(dis[e[i].to]>dis[u]+1&&g[e[i].to]==(-1)&&e[i].rest>0){
                    g[e[i].to]=i;
                    flow[e[i].to]=min(flow[u],e[i].rest);
                    dis[e[i].to]=dis[u]+1;
                    if(vis[e[i].to]==false){
                        vis[e[i].to]=true;
                        q.push(e[i].to);
                    }
                }
            }
        }
    }
    
    int EK(int s,int t){
        while(1){
            memset(vis,false,sizeof(vis));
            memset(dis,0x7f,sizeof(dis));
            memset(flow,0x7f,sizeof(flow));
            memset(g,-1,sizeof(g));
            bfs(s,t);
            if(g[t]==(-1))return 0;
            ans+=flow[t];
            for(int p=t;p!=(s);p=e[g[p]].from){
                e[g[p]].rest-=flow[t];
                e[g[p]^1].rest+=flow[t];
            }    
            
        }
    }
    
    int main(){
        memset(h,-1,sizeof(h));
        cin>>k>>n;
        for(int i=1;i<=k;i++){
            int x;cin>>x;sum+=x;
            add(0,i,x);
            add(i,0,0);
        }
        for(int i=1;i<=n;i++){
            int num,x;cin>>num;
            add(i+k,n+k+1,1);
            add(n+k+1,i+k,0);
            for(int j=1;j<=num;j++){
                cin>>x;
                add(x,i+k,1);
                add(i+k,x,0);
            }
        }
        EK(0,n+k+1);
        if(sum==ans){
            for(int i=1;i<=k;i++){cout<<i<<":";
                for(int j=h[i];j!=(-1);j=e[j].next){
                    if(e[j].rest==0&&e[j].to!=0){
                        cout<<" "<<e[j].to-k;
                    }
                }
                cout<<endl;
            }
        }
        else{
            cout<<"No Solution!"<<endl;
            exit(0);
        }
    } 
    View Code

    水题

  • 相关阅读:
    C# 系统应用之通过注册表获取USB使用记录(一)
    web项目测试方法总结
    C#面向对象编程实例-猜拳游戏
    c#基础这些你都看过吗?(一)-----仅供初学者使用
    .NET事件监听机制的局限与扩展
    SQL代码
    泛型接口委托
    存储过程
    小操作
    DataGridView
  • 原文地址:https://www.cnblogs.com/shatianming/p/12227618.html
Copyright © 2011-2022 走看看