最大流和最小的最短增益路径法.docVIP

  • 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)

1亿VIP精品文档

相关文档