POJ 3436.ACM Computer Factory

来源:互联网 发布:mysql 查询会锁表吗 编辑:程序博客网 时间:2024/05/30 05:41

题目:http://poj.org/problem?id=3436

代码(C++,WA):

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>


#define INF 0xfffffff
#define MAXN 2005


using namespace std;


int n,p;
int map[MAXN][MAXN];
int map1[MAXN][MAXN];
int edgenum[MAXN][MAXN];
bool vis[MAXN];
int pre[MAXN];
vector<int> starts;
int ans[MAXN][3];
int anscount;


bool getroute(int s, int e){
    int len = pow(2.0,p);
    int temp;
    memset(vis,false,sizeof(vis));
    for (int i = 0; i < len; i++)pre[i] = -1;
    bool haveroute = false;
    queue<int> que;
    que.push(s);
    vis[s] = true;
    while (!haveroute && !que.empty()){
        temp = que.front();
        que.pop();
        for (int i = 0; i < len; i++){
            if (map[temp][i] && !vis[i]){
                vis[i] = true;
                pre[i] = temp;
                if (i == e){
                    haveroute = true;
                    break;
                }
                que.push(i);
            }
        }
    }
    if (!haveroute)return false;
    return true;
}


int getMaxflow(int s, int e){
    int t;
    int result = 0;
    anscount = 0;
    while (getroute(s, e)){
        int minflow = INF;
        t = e;
        while (pre[t] != -1){
            minflow = min(minflow, map[pre[t]][t]);
            t = pre[t];
        }
        t = e;
        while (pre[t] != -1){
            map[pre[t]][t] -= minflow;
            map[t][pre[t]] += minflow;
            int a = edgenum[pre[t]][t];
            //int b = map1[pre[t]][t];
            t = pre[t];
            if(edgenum[pre[t]][t]!=0){
            ans[anscount][0]=edgenum[pre[t]][t];
            ans[anscount][1]=a;
            ans[anscount][2]=minflow;
            anscount++;
}
        }
        result += minflow;
    }
    return result;
}


void dfs(int* pp, int i, int num){
if(i==p)starts.push_back(num);
else{
if(pp[i]==0)dfs(pp,i+1,num);
else if(pp[i]==1){
num+=pow(2.0,i);
dfs(pp,i+1,num);
}
else if(pp[i]==2){
dfs(pp,i+1,num);
num+=pow(2.0,i);
dfs(pp,i+1,num);
}
}
}


int main(){
cin>>p>>n;
memset(map,0,sizeof(map));
int end;
int value;
for(int i = 0; i < n; i++){
cin>>value;
int pp[15];
for(int j = 0; j < p; j++)cin>>pp[j];
starts.clear();
dfs(pp,0,0);
for(int j = 0; j < p; j++)cin>>pp[j];
end = 0;
for(int j = 0; j < p; j++)if(pp[j]==1)end+=pow(2.0,j);
for(vector<int>::iterator it = starts.begin(); it != starts.end(); it++){
if(value>map[*it][end]){
map[*it][end] = value;
map1[*it][end] = value;
edgenum[*it][end] = i+1;
}
}
}
cout<<getMaxflow(0,pow(2.0,p)-1)<<' ';
cout<<anscount<<endl;
for(int i = 0; i < anscount; i++){
cout<<ans[i][0]<<' '<<ans[i][1]<<' '<<ans[i][2]<<endl;
}
}

总结: 对最大流不是很了解, 不知道错在哪, 先开个坑. 有大神知道错在哪里有劳提醒.

原创粉丝点击