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

牛人帮我看一下呀,WA N次了。

Posted by hepeng597 at 2009-04-26 20:45:12 on Problem 3436
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;

#define   max(a,b)    ((a)>(b)?(a):(b))
#define   min(a,b)    ((a)<(b)?(a):(b))
#define   sqr(a)         ((a)*(a))
#define   rep(i,a,b)  for(i=(a);i<(b);i++)
#define   REP(i,n)     rep(i,0,n)
#define   inf         1000000000
#define   eps		1e-12
#define MAXV 110
int g[MAXV][MAXV];
int gg[MAXV][MAXV];
int start,end;
int n,np;
int path[MAXV];
struct node{
	int p;
	int input[15];
	int output[15];
};
node data[MAXV];
bool bfs()
{
	int i;
	queue<int> q;
	memset(path,-1,sizeof path);
	q.push(start);
	while(!q.empty())
	{
		int cur=q.front();
		q.pop();
		if(cur==end) break;
		rep(i,1,2*n+2)
		{
			if(g[cur][i]>0&&path[i]==-1)
			{
				path[i]=cur;
				q.push(i);
			}
		}
	}
	if(path[end]==-1) return false;
	return true;
}
int edmonds_karp()
{
	int max_flow=0;
	while(bfs())
	{
		int next=end,pre=path[end],min=inf;
		while(next!=start)
		{
			min=min(min,g[pre][next]);
			next=pre;
			pre=path[next];
		}
		max_flow+=min;
		next=end,pre=path[end];
		while(next!=start)
		{
			g[pre][next]-=min;
			g[next][pre]+=min;
			gg[pre][next]+=min;
			next=pre;
			pre=path[next];
		}
	}
	return max_flow;
}
void make_graph()
{
	int i, j, k, fail;
	for (i = 1; i <= n; i++)
	{
		g[i][i + n] = data[i].p;
		for (j = 1; j <= n; j++)
		{
			if (i == j)
				continue;
			fail = 0;
			for (k = 0; k < np; k++)
			{
				if (data[i].output[k] == data[j].input[k] || data[j].input[k] == 2)
					continue;
				fail = 1;
				break;
			}
			if (!fail)
				g[i + n][j] = data[j].p;
		}
	}
	start = 0;
	for (i = 1; i <= n; i++)
	{
		fail = 0;
		for (k = 0; k < np; k++)
			if (data[i].input[k] == 1)
			{
				fail = 1;
				break;
			}
			if (!fail)
				g[start][i] = data[i].p;
	}
	end = 2 * n + 1;
	for (i = 1; i <= n; i++)
	{
		fail = 0;
		for (k = 0; k < np; k++)
			if (!data[i].output[k])
			{
				fail = 1;
				break;
			}
			if (!fail)
				g[i + n][end] = data[i].p;
	}
}
int main()
{
	int i,j,res,num;
	int temp[5000][3];
	scanf("%d%d",&np,&n);
	memset(g,0,sizeof g);
	memset(gg,0,sizeof gg);
	memset(data,0,sizeof data);
	num=0;
	REP(i,n)
	{
		scanf("%d",&data[i+1].p);
		REP(j,np) scanf("%d",&data[i+1].input[j]);
		REP(j,np) scanf("%d",&data[i+1].output[j]);
	}
	make_graph();
	res=edmonds_karp();
	num=0;
	rep(i,1,n+1) 
		rep(j,1,n+1) 
		if(i!=j&&gg[i+n][j]>0) {temp[num][0]=i;temp[num][1]=j;temp[num++][2]=gg[i+n][j];}
	printf("%d %d\n",res,num);
	REP(i,num) printf("%d %d %d\n",temp[i][0],temp[i][1],temp[i][2]);
	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