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

Re:同求数据,附上wa代码

Posted by hataksumo at 2012-07-25 13:47:37 on Problem 1149
In Reply To:求数据啊,sample过了,自己编的数据也过了,可是提交还是WA Posted by:karying at 2011-04-03 15:42:46
#include<cstdio>
#include<memory>
#define ME 310000
#define MM 110
#define MN 11000
#define min(a,b) (((a)<(b))?(a):(b))
class edge
{
public:
	int to;
	int pre;
	int limit;
};
edge edges[ME];
int box[MN];
bool customConnect[1024][128];
int len;
int ss,ms,nks,nkc,nws,ts;
void iniPreLinkList(int m,int n)
{
	int i;
	len=0;
	ss = 0;
	ms = 0;
	nks = m+ms;
	nkc = nks+n;
	nws = nkc+n;
	ts = nws+n+1;
	for(i=0;i<=ts;i++)
		box[i] = -1;
	memset(customConnect,false,sizeof(customConnect));
}
void printList(int m,int n)
{
	int ads,i;
	for(i=0;i<ts;i++)
	{
		printf("结点%d: ",i);
		for(ads = box[i];ads!=-1;ads = edges[ads].pre)
		{
			printf("->(%d,%d)",edges[ads].to,edges[ads].limit);
		}
		printf("\n");
	}
}
void addDirectedEdge(int frm,int to,int limit)
{
	edges[len].pre = box[frm];
	edges[len].to = to;
	edges[len].limit = limit;
	box[frm] = len++;
}
#define MVAL 0x7f7f7f7f
void makeGraphic(int m,int n)
{
	int i,j, reserves,num,key,requir;
	iniPreLinkList(m,n);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&reserves);
		addDirectedEdge(ss,ms+i,reserves);
	}
	for(i=1;i<=n;i++)
	{
		scanf("%d",&num);
		while(num--)
		{
			scanf("%d",&key);
			customConnect[key][i] = true;
			addDirectedEdge(ms+key,nks+i,MVAL);
			for(j=1;j<MN;j++)
			{
				if(customConnect[key][j])
					addDirectedEdge(nks+j,nkc+i,MVAL);
			}
		}
		scanf("%d",&requir);
		addDirectedEdge(nkc+i,nws+i,requir);
		addDirectedEdge(nws+i,ts,MVAL);
	}
}

int path[10];
int dfs(int rt,int step)
{
	int ads,upd;
	if(step==5)return MVAL;
	for(ads=box[rt];ads!=-1;ads = edges[ads].pre)
	{
		//printf("step=%d搜索到%d,limit=%d\n",step,edges[ads].to,edges[ads].limit);
		//getchar();
		if(edges[ads].limit>0)
		{
			path[step] = ads;
			upd = min(edges[ads].limit,dfs(edges[ads].to,step+1));
			if(upd>0)
				return upd;
		}
	}
	return -1;
}
int solve(int m,int n)
{
	int sum=0,upd,i,j;
	do
	{
		upd=dfs(ss,0);
		if(upd!=-1)
		{
			sum+=upd;
			for(j=0;j<5;j++)
			{
				edges[path[j]].limit-=upd;
			}
		}
	}while(upd!=-1);
	return sum;
}
int main()
{
	int m,n;
	while(~scanf("%d%d",&m,&n))
	{
		makeGraphic(m,n);
		//printList(m,n);
		printf("%d\n",solve(m,n));
	}
	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