network flow based on BFS

Hello,everyone.Long time no meeting.Graph theory is a little difficult for me.Because the code is difficult to write.And i have not learned STL yet.So i spend so time to find my own data structure,and spend a lot of time to get my code passed.Luckily,i find my ability is growing day by day.Now i can easily find the mistakes in my code.

Have fun coding,i_human.Have fun coding,everyone!


THE CODE:


// 网络流算法 BFS.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#define a 100
#define m 1000

using namespace std;

int n,e,s,t,l;
int f=0;
int flow[a][a],pre[2][a],rec[a][a],cap[a][a],relpre[a];

bool find();
void operate();

int main()
{
	int u,v,w;
	cin>>s>>t;
	for(int i=0;i<a;i++)
		for(int j=0;j<a;j++)
		{
			flow[i][j]=0;
			cap[i][j]=0;
			rec[i][j]=0;
		}
	for(int i=0;i<a;i++)
	{
		pre[0][i]=0;
		pre[1][i]=0;
		relpre[i]=0;
	}
	pre[0][0]=s;
	pre[1][0]=0;
	relpre[s]=s;
	cin>>n>>e;
	for(int i=0;i<e;i++)
	{
		cin>>u>>v>>w;
		cap[u][v]=w;
		rec[u][0]++;
		rec[u][rec[u][0]]=v;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
			cout<<rec[i][j]<<" ";
		cout<<endl;
	}
	while(find())
	{
		operate();
		for(int i=1;i<=n;i++)
			relpre[i]=0;
		relpre[s]=s;
		pre[0][0]=s;
		pre[1][0]=0;
	}
	cout<<f<<endl;
	system("pause");
	return 0;
}

bool find()
{
	int start=pre[1][0];
	int end=pre[1][0];
	bool flag=0;
	int num=0;
	l=pre[1][0]+1;
	while(flag==0 && l<=n)
	{
		num=0;
		for(int i=start;i<=end;i++)
		{
			for(int j=1;j<=rec[pre[0][i]][0];j++)
			{
				if(relpre[rec[pre[0][i]][j]]!=0)
					continue;
				if(relpre[rec[pre[0][i]][j]]==0)
				{
					pre[0][end+j]=rec[pre[0][i]][j];
					pre[1][end+j]=l;
					relpre[rec[pre[0][i]][j]]=pre[0][i];
					num++;
				}
				if(rec[pre[0][i]][j]==t)
				{
					flag=1;
					return flag;
				}
			}	
		}
		l++;
		start=end+1;
		end=end+num;
	}
	return flag;
}

void operate()
{
	int path[a];
	int min=a;
	int r=t;
	int pot;
	path[l]=t;
	for(int i=l-1;i>=0;i--)
	{
		path[i]=relpre[r];
		r=relpre[r];
	}
	for(int i=0;i<l;i++)
	{
		if(cap[path[i]][path[i+1]]<min)
			min=cap[path[i]][path[i+1]];
	}
	f+=min;
	for(int i=0;i<l;i++)
	{
		cap[path[i]][path[i+1]]-=min;
		flow[path[i]][path[i+1]]+=min;
		if(cap[path[i]][path[i+1]]==0)
		{
			for(int j=1;j<=rec[path[i]][0];j++)
			{
				if(rec[path[i]][j]==path[i+1])
				{
					pot=j;
					break;
				}
			}
			if(pot!=rec[path[i]][0])
			{
				for(int k=pot+1;k<=rec[path[i]][0];k++)
					rec[path[i]][k-1]=rec[path[i]][k];
			}
			rec[path[i]][0]--;
		}
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值