最大流問題

  最大流問題是算法當中經典問題,主要是不斷搜索增廣路徑,如果搜索到則將增廣量累加,知道找不到增廣路徑爲止。

下面是最大流的主要代碼實現:
#include "stdio.h"
#define N 500
//鄰接矩陣存儲網絡中的邊及上面的權值
//long N=500;
long netEdge[N][N];
//初始化增廣路徑通過容量,方便比較求出每次增廣路徑上的增廣量
long augmentValue=0x7FFFFFFF;
//存儲增廣路徑
long path[N];
//最大流的起點和終點
long start,end;
//網絡中的頂點和邊的個數
long nodeCount,edgeCount;
typedef struct
{
int front,rear;//front隊頭,rear隊尾
int array[N];//存儲隊列元素
int length;//隊列長度
}Queue;
void InitQueue(Queue &q)
{//初始化隊列
 }
int Empty(Queue &q)
{//判斷隊列是否爲空,空則返回1,不空爲0
}
int Push(Queue &q,long x)
{//將元素x入隊,入隊成功則返回1,失敗返回0
}
int Pop(Queue &q,long &x)
{//將隊列隊頭元素出隊,存入x中
  }
void Init()
{//初始化路徑
}
long min(long a,long b)
{//比較a與b,返回較小的一個
}
long BFS()
{ //廣度搜索增廣路徑,若搜索到則將增廣量返回  
Queue q;//定義隊列
InitQueue(q);//初始化隊列 
Init();//初始化路徑
path[start]=0;
if(Push(q,start)==0)//起點入隊列
{
printf("隊列已滿,起點入隊列失敗!");
}
while(!Empty(q))
{
 long pre;//出隊
 if(Pop(q,pre)==0)
 {
 printf("隊列已空,出隊失敗!");
 }
 if(pre==end)
 break;
 for(long i=1;i<=nodeCount;i++)
 {
 if(i!=start && path[i]==-1 && netEdge[pre][i]!=0)
 {
 augmentValue=min(augmentValue,netEdge[pre][i]);
 Push(q,i);
 path[i]=pre;
 }
 }
}


if(path[end]==-1)
{
return -1;
}
   
return augmentValue;
}
void Ford_Fulkerson()
{//找出增廣量就將其加在maxFlow變量上,知道找不到增廣量爲止
  printf("請輸入帶權值的邊所對應的兩節點的編號(最小爲1)及邊的權值:\n");
  long i,j,k,maxFlow=0;
  for(long m=0;m<edgeCount;m++)
  {
    scanf("%ld %ld %ld",&i,&j,&k);
netEdge[i][j]=k;
  }
  printf("請輸入起點和終點編號:\n");
  scanf("%ld %ld",&start,&end);
  long ret=0,now=0;
  while((ret=BFS())!=-1)
  {
   maxFlow+=ret;
   now=end;
   while(now!=start)
   {
  long pre=path[now];
  netEdge[pre][now]-=ret;
  netEdge[now][pre]+=ret;
  now=pre;
   }
  }
  printf("最大流爲:%ld\n",maxFlow);
}
void main()
{
while(1)
{
  printf("請輸入網絡中的頂點數和邊數:\n");
  scanf("%ld %ld",&nodeCount,&edgeCount);
 //printf("%ld %ld\n",nodeCount,edgeCount);
  Ford_Fulkerson();
}
 


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章