以下代码返回零作为输出,请告诉我有什么问题?
#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
答案 0 :(得分:0)
您的reachable()
功能不是广度优先搜索。例如,查看this pseudo-code并将其与您的进行比较。你做的很好,直到“为每个边缘”部分,你代替做“为每个节点”,它只是从那里分崩离析。
您还混合了基于0和基于索引的索引:您输入为基于1,但在reachable()
中,循环for(int i=0;i<V;i++)
基于0。选择一个系统并使其保持一致。
此代码还有许多其他潜在问题,一旦您修复reachable()
,就会导致更多问题。我建议CodeReview网站获取进一步的反馈。