HDU-1572 下沙小面的(2) DFS

  首先解释下这题的名字,下沙是个地名,面的是一种公共交通工具,小是个形容词......

  对于这题那便是DFS纯暴力了,每次先到达不同的第一站,再扩展下去到第二站... 暴力枚举每一种可能,最后保留最小值。

  代码如下:

#include <cstdio>
#include <cstring>
#include <cstdio>
using namespace std;

int map[35][35], N, K, obj[35], RK;

void DFS( int pos, int step, int dis, int &ans )
{
	if( step== RK )
	{
		ans= ans< dis? ans: dis;
	}
	for( int i= 1; i< N; ++i )
	{
		if( obj[i] ) // 如果有人要求到该栈而又没有开去过
		{
			obj[i]= 0;
			DFS( i, step+ 1, dis+ map[pos][i], ans );
			obj[i]= 1;
		}
	}
}

int main()
{
	while( scanf( "%d", &N ), N )
	{
		int ans= 0x7fffffff;
		RK= 0;
		memset( map, 0, sizeof( map ) );
		memset( obj, 0, sizeof( obj ) );
		for( int i= 0; i< N; ++i )
		{
			for( int j= 0; j< N; ++j )
			{
				scanf( "%d", &map[i][j] );
			}
		}
		scanf( "%d", &K );
		for( int i= 1; i<= K; ++i )
		{
			int c;
			scanf( "%d", &c );
			if( obj[c]== 0 )
			{
				obj[c]= 1;
				RK++;// 用来记录总共有多少不重复的站
			}
		}
		DFS( 0, 0, 0, ans );
		printf( "%d\n", ans );
	}
	return 0;
}
posted @ 2011-08-12 15:09  沐阳  阅读(535)  评论(0编辑  收藏  举报