Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

下面的代码在POJ可以AC,可是在XOJ(链接在内)确实WA了。。。请牛人指教。

Posted by yogafrank at 2008-10-15 23:57:07 on Problem 1273
http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1089

#include <iostream>
#include <queue>
using namespace std;

class Graph
{
public:
	int capacity, flow;
};
const int N = 201;
const int INFINITE = 0x7f7f7f7f;
int residual[N][N], n, m, minaugement;
Graph graph[N][N];
int start, end, maxflow, pre[N];
bool used[N];

void findaugementpath ()
{
	queue <int> q;
	memset ( pre, 0, sizeof ( pre ) );
	memset ( used, false, sizeof ( used ) );
	memset ( residual, 0, sizeof ( residual ) );
	used[start] = true;
	pre[start] = start;
	q.push( start );

	while ( !q.empty() && pre[end] == 0 )
	{
		int node = q.front();
		q.pop();

		for ( int v = 1; v <= m; v++ )
			if ( !used[v] )
			{
				int value;
				if ( ( value = graph[node][v].capacity - graph[node][v].flow ) > 0 )
				{
					pre[v] = node;
					q.push( v );
					used[v] = true;
					residual[node][v] = value;
				}
				else if ( graph[v][node].flow > 0 )
				{
					pre[v] = node;
					q.push( v );
					used[v] = true;
					residual[node][v] = graph[v][node].flow;
				}
			}
	}
}

void augementflow ()
{
	if ( pre[end] == 0 )
	{
		minaugement = 0;
		return;
	}

	int i = end, j = INFINITE;
	while ( i != start )
	{
		j = j < residual[pre[i]][i] ? j : residual[pre[i]][i];
		i = pre[i];
	}

	minaugement = j;
}

void updateflow ()
{
	if ( pre[end] == 0 )
		return;

	int i = end;
	while ( i != start )
	{
		if ( graph[pre[i]][i].capacity - graph[pre[i]][i].flow > 0 )
			graph[pre[i]][i].flow += minaugement;
		else if ( graph[i][pre[i]].flow > 0 )
			graph[pre[i]][i].flow += minaugement;
		i = pre[i];
	}
}

void Ford_Fullerson ()
{
	start = 1, end = m;
	maxflow = 0;

	while ( true )
	{
		findaugementpath ();
		augementflow ();

		maxflow += minaugement;

		if ( minaugement > 0 )
			updateflow ();
		else break;
	}

	printf ( "%d\n", maxflow );
}

int main ()
{
//	freopen ( "1273.txt", "r", stdin );
	while ( scanf ( "%d%d", &n, &m ) != -1 )
	{
		int s, t, w;
		memset ( graph, 0, sizeof ( graph ) );
		for ( int i = 0; i < n; i++ )
		{
			scanf ( "%d%d%d", &s, &t, &w );
			graph[s][t].capacity += w;
		}

		Ford_Fullerson ();
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator