- 20
- 0
- 约3.57千字
- 约 7页
- 2018-10-17 发布于江苏
- 举报
最大流和最小的最短增益路径法
最大流和最小割的最短增益路径法
第 PAGE \* MERGEFORMAT 7页
最大流和最小割的最短增益路径法
实验目的:
1.理解迭代改进基本原理;
2.掌握最短增益路径法;
实验平台:
Microsoft Visual C++ 6.0
实验过程:
1.编程实现最短增益路径算法:
#include iostream
#include cstdlib
#include queue
using namespace std;
class G
{
public:
G();
G(int n,int start,int end);
void Edge(int a,int b,int flow); //a,b之间的流量
void Maxflow(); //计算最大流
void Leastcut(); //计算最小割
private:
int N,Start,End, //N是顶点个数,Start是源点End是汇点
**Map, //网络流量
**Flow, //通过流量
**Rest, //剩余流量
*Pre, //标记流向,正为前向,负为后向
*Sign, //顶点是否标记,0为未标记,1为已标记
*P; //过程变量,记录流量
bool SignN(); //标记顶点
int Min(int a,int b); //计算最小值
void Update(); //更新网络
};
G::G() {Pre=NULL;}
G::G(int n,int start,int end)
{
N=n;
Start=start;
End=end;
Map=new int*[N+1];
Flow=new int*[N+1];
Rest=new int*[N+1];
Pre=new int[N+1];
Sign=new int[N+1];
P=new int[N+1];
for(int i=1;i=N;i++)
{
Map[i]=new int[N+1];
Flow[i]=new int[N+1];
Rest[i]=new int[N+1];
Sign[i]=0;
P[i]=0;
}
for(i=1;i=N;i++)
for(int j=1;j=N;j++)
{
Map[i][j]=0;
Flow[i][j]=0;
Rest[i][j]=0;
}
}
int G::Min(int a,int b)
{
if(ab) return a;
return b;
}
void G::Edge(int a,int b,int flow)
{
if(a0 || aN || b0 || bN) return;
Map[a][b]=flow;
}
void G::Update()
{
for(int i=1;i=N;i++)
{
Sign[i]=0;
for(int j=1;j=N;j++)
Rest[i][j]=Map[i][j]-Flow[i][j];
}
}
bool G::SignN()
{
Update();
queueint que;
que.push(Start);
Sign[Start]=1;
P[Start]=1000000;
Pre[Start]=-1;
while(!que.empty())
{
int head=que.front();
que.pop();
for(int i=1;i=N;i++)
{
if(Rest[head][i]0 Sign[i]==0)
原创力文档

文档评论(0)