poj 2531 dfs

一做这题,才感觉我一直没有

真正的理解dfs,dfs其实就是一种枚举,一种靠递归,靠剪枝优化的枚举

而且能根据具体问题进行剪枝,和递归的条件,看来我还得更深刻地去理解一前的算法,这很重要

还有就是vis[]是否访问数组标识,其实就是一个区分,区分成两组,这是实质

#include <stdio.h>
#include <string.h>

#define node 25

int dividen[node];

int c[node][node];

int n,max;

void dfs(int num,int t)
{
	int i,data=t;

	dividen[num]=1;

	for(i=1;i<=n;i++)
	{
		if(!dividen[i])
			data+=c[num][i];
		else
			data-=c[num][i];
	}

	if(data>max)
		max=data;

	for(i=num+1;i<=n;i++)
	{
		if(data>t)
		{
			dfs(i,data);
			dividen[i]=0;
		}
	}
}

int main()
{
	int i,j;

	while(scanf("%d",&n)!=EOF){

		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				scanf("%d",&c[i][j]);

		memset(dividen,0,sizeof(dividen));

		max=0;

		dfs(1,0);

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

	return 0;
}

  

posted @ 2012-04-08 10:58  shijiwomen  阅读(740)  评论(0编辑  收藏  举报