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);
        }
    }
  • 相关阅读:
    读写csv文件
    安卓跳转
    求时间精确到秒的数
    航空公司客户价值分析
    利用LM神经网络和决策树去分类
    拉格朗日插值法
    ID3
    K最近邻
    贝叶斯分类
    FilterDispatcher已被标注为过时解决办法
  • 原文地址:https://www.cnblogs.com/mfys/p/7324800.html
Copyright © 2011-2022 走看看