最大流問題是算法當中經典問題,主要是不斷搜索增廣路徑,如果搜索到則將增廣量累加,知道找不到增廣路徑爲止。
#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();
}
}