double solve()
{
    int i, j;
    double ret;
    make_net();
    ret = Edmonds_Karp();
    return  exp(ret);
}
Exemple #2
0
 //利用找出的最大流,从中找出一个最小割(adjacency matrix)
void  find_min_cut ( int  s ,  int  t )
{
    Edmonds_Karp ( s ,  t );
 
    memset ( visit ,  false ,  sizeof ( visit ));
    DFS ( s );
 
    for  ( int  i = 0 ;  i < 10 ; ++ i )     //穷举源点侧的点
        if  ( visit [ i ])
            for  ( int  j = 0 ;  j < 10 ; ++ j )     ​​//穷举汇点侧的点
                if  (! visit [ j ])
                    if  ( C [ i ][ j ] >  0 )     //要确定有边
                        cout  <<  "Cut上的边有"
                            <<  "由"  <<  i  <<  "到"  <<  j  <<  endl ;
}
Exemple #3
0
int main()
{
	int n,m;
	int u,v,c;
	while(cin>>n>>m)
	{
		for(int i = 0; i < MAXN; i++)
			Map[i].clear();
		n_edge=0;
		for(int i = 0; i < n; i++)
		{
			cin>>u>>v>>c; u--; v--;
			if(c>0)
				addEdge(u,v,c,0);
		}
		cout<<Edmonds_Karp(0,m-1)<<endl;
	}
	return 0;
}
int CFordFulkson::RunFF()
{
	int i = 0;
	int _min = 0;
	int total = 0;

	while(true)
	{
		if(!Edmonds_Karp())
		{	
			// 进来就表示没有找到增广路径
			// 为每条链路找到上一条链路
			POSITION pos = pLinkList->GetHeadPosition();
			while (pos != NULL)
			{
				CLink* pLink = (CLink*)pLinkList->GetAt(pos);
				if (pLink->nShared % 2 == 1)
				{
					
					POSITION pos2 = pLinkList->GetHeadPosition();
					bool bNeedExit = false;
					while (pos2 != NULL)
					{	
						CLink* pPreLink = (CLink*)pLinkList->GetAt(pos2);
						if ((pPreLink->nShared % 2 == 1) && pPreLink->nEndAt == pLink->nStartAt)
						{


							bool bFind = false;
							for (int k=0; k<pLink->nInputLink; k++)
							{
								if (pLink->nPreLink[k] == pPreLink->nLinkNum)
								{
									bFind = TRUE;
									break;
								}
							}
							if (bFind == TRUE)
							{
								bNeedExit = true;
							}
							else
							{
								int n = pLink->nInputLink;
								pLink->nPreLink[n] = pPreLink->nLinkNum;
								pLink->nInputLink++;
								bNeedExit = true;	
							}

						}

						if (bNeedExit == TRUE)
						{
							break;
						}
						else
						{
							pLinkList->GetNext(pos2);
						}
						
					}
					
					
				}
	
				pLinkList->GetNext(pos);
			
			}

			// 此时nShared为奇数表示到该汇聚节点最大流时用到的链路
			pos = pLinkList->GetHeadPosition();
			int nRouteNum = 0;
			while (pos != NULL)
			{
				CLink* pLink = (CLink*)pLinkList->GetAt(pos);
				if (pLink->nStartAt == nSrc && pLink->nShared%2 == 1  && pLink->bAddToRouteTable == FALSE)		//	起点为源节点
				{
					// Output the route array to the sink node
					int nCurPos = nSrc;
					int nHopNum = 0;
					Route[nRouteNum][nHopNum++] = pLink->nLinkNum;	

					CLink *pPre_link = pLink;
					while(1)
					{		
						POSITION next_pos = pLinkList->GetHeadPosition();
						while (next_pos != NULL)
						{
							CLink* pNextLink = (CLink*)pLinkList->GetAt(next_pos);
							if (pNextLink->nStartAt == pPre_link->nEndAt && pNextLink->bAddToRouteTable == FALSE && pNextLink->nShared%2 == 1)
							{
								Route[nRouteNum][nHopNum++] = pNextLink->nLinkNum;
								pNextLink->bAddToRouteTable = TRUE;
								pPre_link = pNextLink;
								break;
							}

							pLinkList->GetNext(next_pos);

						}
						if (pPre_link->nEndAt == nDes)
						{
							break;
						}

					}
					nRouteNum++;
				}
				pLinkList->GetNext(pos);
				
			}



			 // 将必要的链路标记出来
			pos = pLinkList->GetHeadPosition();
			while (pos != NULL)
			{
				CLink* pLink = (CLink*)pLinkList->GetAt(pos);
				if (pLink->nShared % 2 == 1)
				{
					pLink->bInSubGraph = TRUE;
				
				}
				pLink->nShared = 0;
				pLink->bAddToRouteTable = FALSE;			// Reset
				pLinkList->GetNext(pos);
			}
		


			return total;;				//如果找不到增广路就返回,在具体实现时替换函数名
		}
		_min = (1<<30);
		int des = nDes - 1;
		int src = nSrc - 1;
		i = des;
		while(i != src)
		{								//通过pre数组查找增广路径上的边,求出残留容量的最小值
			if(_min > C[PreNode[i]][i])
			{
				_min=C[PreNode[i]][i];
			}
			i = PreNode[i];
		}
		i = des;
		while (i != src)
		{    //再次遍历,更新增广路径上边的流值
			C[PreNode[i]][i] -= _min;
			C[i][PreNode[i]] += _min;
			i = PreNode[i];
		}
		total += _min;     //每次加上更新的值

		// Record the route
		int nHops = 0;
		i = des;
		int routeTemp[20];
		routeTemp[0] = des;
		while ( TRUE )
		{
			if (PreNode[i] == src)
			{
				nHops++;
				routeTemp[nHops] = PreNode[i];
				i= PreNode[i];
				break;
			}
			else
			{
				nHops++;
				routeTemp[nHops] = PreNode[i];
				i= PreNode[i];
				
			}
		}
		// Reverse the route, and store it into Routes array.
// 		for (i=0; i<nHops; i++)
// 		{
// 			Route[total-1][i] = routeTemp[nHops-1-i];
// 		}

		for (i=0; i<nHops; i++)
		{
			int nCnt = pLinkList->GetCount();
			POSITION pos = pLinkList->GetHeadPosition();
			while (pos != NULL)
			{
				// Both direction is ok.
				CLink* pLink = (CLink*)pLinkList->GetAt(pos);
				// Since the number of node start with 1, but the index in the array starts with 0,
				// So we must decrease 1.
				if (pLink->nStartAt-1 == routeTemp[i] && pLink->nEndAt-1 == routeTemp[i+1])
				{
					pLink->nShared = pLink->nShared+1;
				
				}
				// OR
				if (pLink->nEndAt-1 == routeTemp[i] && pLink->nStartAt-1 == routeTemp[i+1])
				{
					pLink->nShared = pLink->nShared+1;
				
				}
				pLinkList->GetNext(pos);
			}

		}	
		
	}
	// 


	

}