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了16次了,不知道哪里错了啊,救命啊~~

Posted by alpc62 at 2007-05-26 07:53:21 on Problem 1273
这几天饭都吃不进去,麻烦哪位大哥指点我一下,这是改动后的最后一次代码……

#include <stdio.h>
#include <memory.h>
#define MAXINT 1000000000
#define S 201

int na,nb,n,s,t,l[S],p[S][S],f[S][S],c[S][S],pre[S],m[S],a[S],b[S],d[S];

int min(int x,int y)
{
	return (x<y)?x:y;
}

bool bfs()
{
	int i,j,k;
	memset(pre,0,sizeof(pre));
	memset(d,0,sizeof(d));
	memset(a,0,sizeof(a));
	pre[t]=t;
	for (a[1]=t,na=1;!pre[s];)
	{
		nb=0;
		for (k=1;k<=na;k++)
		{
			i=a[k];
			for (j=1;j<=l[i];j++)
				if (!pre[p[i][j]])
				{
					b[++nb]=p[i][j];
					pre[b[nb]]=i;
					d[b[nb]]=d[i]+1;
				}
		}
		if (!nb)	return false;
		memset(b,0,sizeof(a));
		for (na=nb,i=1;i<=na;i++)	a[i]=b[i];
		memset(b,0,sizeof(b));
	}
	return true;
}

int shortest_augument()
{
	int i,j,k,temp,res=0;
	bool have;
	if (!bfs())	return 0;
	memset(pre,0,sizeof(pre));
	memset(m,0,sizeof(m));
	m[s]=MAXINT;
	pre[s]=s;
	for (i=s;d[s]<n;)
	{
		have=false;
		for (k=1;k<=l[i];k++)
		{
			j=p[i][k];
			if (d[i]==d[j]+1 && !pre[j] && c[i][j]-f[i][j]>0)
			{
				pre[j]=i;
				m[j]=min(m[i],c[i][j]-f[i][j]);
				i=j;
				if (pre[t])
				{
					for (i=t;i!=s;i=pre[i])
					{
						f[pre[i]][i]+=m[t];
						f[i][pre[i]]=-f[pre[i]][i];
					}
					memset(pre,0,sizeof(pre));
					memset(m,0,sizeof(m));
					m[s]=MAXINT;
					pre[s]=s;
				}
				have=true;
				break;
			}
		}
		if (!have)
		{
			temp=MAXINT;
			for (k=1;k<=l[i];k++)
			{
				j=p[i][k];
				if (!pre[j] && c[i][j]-f[i][j]>0)
				{
					have=true;
					if (d[j]<temp)	temp=d[j];
				}
			}
			if (have)	d[i]=temp+1;
			else	d[i]=n,i=pre[i];
		}
	}
	for (i=1;i<=l[s];i++)
		res+=f[s][p[s][i]];
	return res;
}

main()
{
	int i,m,u,v,x;
	for (;scanf("%d%d",&m,&n)!=EOF;printf("%d\n",shortest_augument()))
	{
		s=1;
		t=n;
		memset(l,0,sizeof(l));
		memset(p,0,sizeof(p));
		memset(c,0,sizeof(c));
		memset(f,0,sizeof(f));
		for (i=1;i<=m;i++)
		{
			scanf("%d%d%d",&u,&v,&x);
			if (c[u][v] || c[v][u])	c[u][v]+=x;
			else if (x)
			{
				p[u][++l[u]]=v;
				p[v][++l[v]]=u;
				c[u][v]=x;
			}
		}
	}
	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