maxflow算法返回零结果

时间:2011-11-04 11:33:07

标签: graph-theory c++

以下代码返回零作为输出,请告诉我有什么问题?

#include<iostream>
#define MAX 100
using namespace std;
int graph[MAX][MAX];
int queue[MAX];
int head,tail;
int parent[MAX];
int V,E;
int s,t,fTotal;
int F[MAX][MAX];

//breadth First search
bool reachable(int s,int  t){
    bool found=false;
    head=tail=0;
    int vq;
    memset(parent,255,sizeof(parent));
    queue[tail++]=s;
    parent[s]=s;
    while(head< tail && ! found){
        vq=queue[head++];
        for(int i=0;i<V;i++){
            //Parents also made the function as visit vector
            if(graph[vq][i] && parent[i]==-1)
                queue[tail++]=i;
            parent[i]=vq;
            if(i==t){
                found=true;
                break;
            }
        }
    }
    return found;
}

void maxflow(){
    int vj,min;
    fTotal=0;
    while(reachable(s,t)){
        //Gets the minimum possible capacity in edges of the path s to t
        min=graph[parent[t]][t];
        vj=t;
        while(parent[vj]!=vj){
            if(graph[parent[vj]][vj]<min)
                min=graph[parent[vj]][vj];
            vj=parent[vj];
        }

        vj=t;
        while(parent[vj]!=vj){

            graph[parent[vj]][vj]-=min;
            graph[vj][parent[vj]]+=min;
            F[parent[vj]][vj]+=min;
            vj=parent[vj];
        }
        fTotal+=min;
    }
}

bool read(){
    cin>>V>>E>>s>>t;
    if(!V && !E) return false;
    memset(graph,0,sizeof(graph));
    memset(queue,0,sizeof(queue));
    memset(F,0,sizeof(F));
    int v1,v2,val;
    for(int i=0;i<E;i++){
        cin>>v1>>v2>>val;
        graph[v1][v2]=val;
    }
    return true;
}

int  main(){
    while(read()){
        maxflow();
        cout<<" max flow from s to t is : "<<fTotal<<endl;
    }
    return 0;
}

在输入跟随的地方,我输入了6个节点和8个边,源1和接收顶点6。

 (1,2)        2
   (1,3)        3
   (2,4)        3
   (3,4)        1
   (2,5)        1
   (3,5)        1
   (4,6)        2
   (5,6)        3

1 个答案:

答案 0 :(得分:0)

您的reachable()功能不是广度优先搜索。例如,查看this pseudo-code并将其与您的进行比较。你做的很好,直到“为每个边缘”部分,你代替做“为每个节点”,它只是从那里分崩离析。

您还混合了基于0和基于索引的索引:您输入为基于1,但在reachable()中,循环for(int i=0;i<V;i++)基于0。选择一个系统并使其保持一致。

此代码还有许多其他潜在问题,一旦您修复reachable(),就会导致更多问题。我建议CodeReview网站获取进一步的反馈。