zoukankan      html  css  js  c++  java
  • 网络流24题之试题库问题

    题目链接:传送门

    想吐槽一句,这道题和圆桌问题有什么差别吗?貌似并没有什么差别吧,只是在见图的时候改一下而已.详细见网络流24题之圆桌问题

    代码

    #include<bits/stdc++.h>
    #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
    #define rg register
    using namespace std;
    typedef long long ll;
    inline int read(){
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9')  f= (c=='-')?-1:1,c=getchar();
        while(c>='0'&&c<='9')  x=x*10+c-48,c=getchar();
        return f*x;
    }
    struct node{
        int to,next,v;
    }a[100001];
    int cnt,head[1000],dep[1001],s=1,t,cur[1001];
    void add(int x,int y,int c){
        a[++cnt].to=y;
        a[cnt].next=head[x];
        a[cnt].v=c;
        head[x]=cnt;
    }
    queue<int> q;
    int bfs(){
        memset(dep,0,sizeof(dep));
        q.push(s);
        dep[s]=1;
        while(!q.empty()){
            int now=q.front();
            q.pop();
            for(int i=head[now];i;i=a[i].next){
                int v=a[i].to;
                if(a[i].v&&!dep[v])
                    dep[v]=dep[now]+1,q.push(v);
            }
        }
        if(!dep[t])
            return 0;
        return 1;
    }
    int dfs(int k,int list){
        if(k==t)
            return list;
        for(int & i=cur[k];i;i=a[i].next){
            int v=a[i].to;
            if(dep[v]==dep[k]+1&&a[i].v){
                int ans=dfs(v,min(list,a[i].v));
                if(!ans)
                    continue;
                a[i].v-=ans;
                if(i%2)
                    a[i+1].v+=ans;
                else
                    a[i-1].v+=ans;
                return ans;
            }
        }
        return 0;
    }
    int sum;
    int Dinic(){
        int ans=0,k;
        while(bfs()){
            for(int i=1;i<=t;i++)
                cur[i]=head[i];
            while((k=dfs(s,2147483647)))
                ans+=k;
        }
        return ans==sum?1:0;
    }
    int main(){
        int m=read(),n=read(),x;
        t=m+n+2;
        for(int i=1;i<=m;i++)
            x=read(),add(s,i+1,x),add(i+1,s,0),sum+=x;
        for(int i=1;i<=n;i++){
            int p=read();
            for(int j=1;j<=p;j++)
                x=read(),add(x+1,i+m+1,1),add(i+m+1,x+1,0);
            add(i+m+1,t,1),add(t,i+m+1,0);
        }
        int ans=Dinic();
        if(ans==0)
            printf("No Solution!
    "),exit(0);
        for(int i=2;i<=m+1;i++,printf("
    ")){
            printf("%d: ",i-1);
            for(int j=head[i];j;j=a[j].next){
                int v=a[j].to;
                if(!a[j].v&&v!=s)
                    printf("%d ",v-m-1);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    (转)simhash进行文本查重
    项目团队管理随记
    最常见到的runtime exception 异常
    javascript判断嵌套对象属性是否存在
    vim高清大图赏析(附常用快捷键)
    如何避免系统发送垃圾邮件
    使用javascript将数字转化为金额
    分享一个音乐电台(好看的 ui + html5)
    测试代码高亮显示
    Cadence 操作技巧总结1:测试点的生成2
  • 原文地址:https://www.cnblogs.com/hbxblog/p/9716333.html
Copyright © 2011-2022 走看看