网络最大流量问题(数据结构实验三)

#include "stdafx.h"
#include <algorithm>


#include <iostream>

#include <string>
#include<list>
# define maxnum 6//图的结点个数

using namespace std;

class elge;

class elge
{
public:
int start;
int target;
int flow;
operator =(elge x)
{
start=x.start;
flow=x.flow;
target=x.target;
}


};


class point
{
public:

list<elge> adjacent;//邻接表
int num;//序号

 

 


public:
// ~point(void);
};


class path
{
public:
list<elge> p;
int flow;
int onpath(int g)
{
list<elge>::iterator iter3;

for (iter3=p.begin();iter3!=p.end();iter3++)

{
if( (*iter3).target==g)

return 1;

 

 

}
return 0;
}

};

class pathlist
{
public:
list<path> r;
};

 

int main(int argc, char* argv[])
{

pathlist search;//查找过程中用的

pathlist result;//最终结果

int count=0;

point pp[maxnum];

 

list<point> qq[maxnum];//固定为6个点
//图的初始化完成,以下形成邻接表
for (int t=0; t<maxnum; t++)
{//**
int flow;
int w=100000;
cout<<t<<"号节点的邻接表(节点号和边的流量)"<<endl;
while(w!=99)
{//****
cin>> w;

 

if (w!=99)//输入99此队结束

 

{
cin >> flow;
elge * ll;
ll=new elge ;
ll->start=t;
ll->target=w;
ll->flow=flow;
pp[t].adjacent.push_back(*ll);

}

}//****

}//**

 

int haspath=0;
//下面开始查找路径

 

 


do///
{
haspath=0;
search.r.clear();
while(!search.r.empty())
search.r.erase(search.r.begin());//clear search list

 

elge e;


list<elge>::iterator iter4;

for (iter4=pp[0].adjacent.begin();iter4!=pp[0].adjacent.end();iter4++)

{


e=(*iter4);


path y;
y.p.push_back(e);

search.r.push_back(y);


}
if( search.r.empty())
{
cout<<"empty path"<<endl;
break;
}


do//
{
e= search.r.front().p.back(); //first path 's last elge
path hh= search.r.front();
search.r.pop_front();
cout<<hh.p.front().flow<<endl;

 


// find
if(e.target==maxnum-1)
{
haspath=1;

//
int min=10000;
list<elge>::iterator iter ,iter2;

for (iter=hh.p.begin();iter!=hh.p.end();iter++)

{
if( (*iter).flow<min)
{
min=(*iter).flow;


}

}

//确认路径
hh.flow=min;
cout<<min<<endl;
result.r.push_back(hh);
for (iter=hh.p.begin();iter!=hh.p.end();iter++)
{
//修改或者删除边
int i;
for (i=0;i<maxnum;i++)
for (iter2=pp[i].adjacent.begin();iter2!=(pp[i].adjacent.end());iter2++)
{
if ((*iter2).start==(*iter).start&&(*iter2).target==(*iter).target&&(*iter2).flow-min!=0)
(*iter2).flow=(*iter).flow-min ;

if ((*iter2).start==(*iter).start&&(*iter2).target==(*iter).target&&(*iter2).flow-min==0)
{
pp[i].adjacent.erase(iter2);
break;
}

}

//补偿反向边
elge dd;
dd.start=(*iter).target;
dd.target=(*iter).start;
dd.flow=min;
pp[(*iter).target].adjacent.push_back(dd);


}

 

 

 

break;

}//if

 

 

 

//find
//延长路径
//对于每条路径先删除,然后补上所有与为节点相邻的点构成新路径,再补回到
//search中


list<elge>::iterator iter;
//for
for (iter=pp[e.target].adjacent.begin();iter!=pp[e.target].adjacent.end();iter++)

{
//all extended path add into search

if (!hh.onpath((*iter).target))
{hh.p.push_back(*iter);

search.r.push_back(hh);
cout<<hh.flow<<"ext"<<endl;
hh.p.pop_back();}

}


}while (!search.r.empty());//

 


}while(haspath);///

list<path>::iterator ii;

for (ii=result.r.begin();ii!=result.r.end();ii++)
{
getchar();
cout<<(*ii).flow<<"*************"<<endl;//打印各路径流量
}
getchar();

 


return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值