zoukankan      html  css  js  c++  java
  • poj1149 经典建模




     

     

    http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html 以上内容均为转载

    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=160;
    const int INF=99999999;
    vector<int>G[1008];
    bool mp[N][N],used[1008];
    int tot,head[N],dis[N],st,ed,val[1007],sum[N];
    struct node{
       int to,next,w;
    }e[N*N*3];
    void init(){
       tot=0;
       memset(head,-1,sizeof(head));
    }
    void add(int u,int v,int w){
       e[tot].to=v;
       e[tot].w=w;
       e[tot].next=head[u];
       head[u]=tot++;
    }
    bool bfs(){
       memset(dis,-1,sizeof(dis));
       queue<int>Q;
       Q.push(st);
       dis[st]=0;
       while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        for(int i=head[u];i+1;i=e[i].next){
            int v=e[i].to;
            if(dis[v]==-1&&e[i].w>0){
                dis[v]=dis[u]+1;
                if(v==ed) return true;
                Q.push(v);
            }
        }
       }
       return false;
    }
    int dfs(int s,int low){
       if(s==ed||low==0) return low;
       int ans=low,a;
       for(int i=head[s];i+1;i=e[i].next){
        int v=e[i].to;
        if(dis[v]==dis[s]+1&&e[i].w>0&&(a=dfs(v,min(ans,e[i].w)))){
            ans-=a;
            e[i].w-=a;
            e[i^1].w+=a;
            if(!ans) return low;
        }
       }
       if(low==ans) dis[s]=-1;
       return low-ans;
    }
    int main(){
        int n,m,x,num;
        while(scanf("%d%d",&n,&m)!=EOF){
            st=0;ed=m+1;
            memset(sum,0,sizeof(sum));
            for(int i=0;i<=n;++i) G[i].clear();
            for(int i=1;i<=n;++i) scanf("%d",val+i);
            memset(used,0,sizeof(used));
            init();
            for(int i=1;i<=m;++i) {
                scanf("%d",&num);
                while(num--){
                    scanf("%d",&x);
                    if(!used[x]) {used[x]=1;sum[i]+=val[x];}
                    G[x].push_back(i);
                }
                scanf("%d",&x);
                add(i,ed,x);
                add(ed,i,0);
            }
            memset(mp,0,sizeof(mp));
            for(int i=1;i<=n;++i){
                for(int j=0;j<(int)G[i].size();++j){
                    if(!j&&!mp[0][G[i][j]]) {
                        mp[G[i][j]][0]=mp[0][G[i][j]]=1;
                        add(0,G[i][j],sum[G[i][j]]);
                        add(G[i][j],0,0);
                    }
                    else if(!mp[G[i][0]][G[i][j]]) {
                        add(G[i][0],G[i][j],INF);
                        add(G[i][j],G[i][0],0);
                        mp[G[i][0]][G[i][j]]=1;
                    }
                }
            }
            int ans=0;
            while(bfs()) ans+=dfs(0,INF);
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/mfys/p/7324800.html
Copyright © 2011-2022 走看看