Hduoj1572【DFS】

/*下沙小面的(2) 
Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 0   Accepted Submission(s) : 0
Font: Times New Roman | Verdana | Georgia 
Font Size: ← →
Problem Description
前文再续,书接上一题。话说当上小面的司机的Lele在施行他的那一套拉客法则以后,由于走的路线太长,油费又贵,不久便亏本了。(真可怜~)于是他又想了一个拉客的办法。

对于每一次拉客活动,他一次性把乘客都拉上车(当然也不会超过7个,因为位置只有7个)。然后,Lele计算出一条路线(出于某些目的,
Lele只把车上乘客的目的地作为这条路线上的站点),把所有乘客都送到目的地(在这路线上不拉上其他乘客),并且使总路线长度最短。

不过Lele每次都要花很多时间来想路线,你能写个程序帮他嘛? 
Input
本题目包含多组测试。最后一组测试后有一个0代表结束。
每组测试第一行有一个整数NCity(3<=NCity<=30)表示下沙一共有多少个站点(站点从0开始标号)。
然后给你一个 NCity * NCity 的矩阵,表示站点间的两两距离。即这个矩阵中第 i 行 第 j 列的元素表示站点 i 和站点 j 的距离。
(0<=距离<=1000)
再然后有一个整数K(1<=K<=7),表示Lele拉上车的人数。
接下来的一行里包括 K 个整数,代表上车的人分别要去的站点。(0<站点<NCity)

注意:
对于每组测试,Lele都是在站点0拉上乘客的。 
Output
对于每一组测试,在一行内输出一个整数,表示最短路线的长度。 
Sample Input
3
0 1 2
1 0 3
2 3 0
3
1 1 2
0
Sample Output
4
Author
linle 
Source
HDU 2007-1 Programming Contest */
#include<stdio.h>
#include<string.h>
int min, dis[31][31], n, m, sta[31], vis[31], step1, step2, num;
void dfs(int x)
{
	int i, j, k;
	for(i = 0; i < n; ++i)
	{
		if(!vis[i] && sta[i])//if isn't visit and is station, be the next station
		{
			vis[i] = 1;
			step1 += dis[x][i];
			step2++;
			dfs(i);
			vis[i] = 0;
			step1 -= dis[x][i];
			step2--;
		}
	}
	if( step2 == num && step1 < min)//when get the end 
	min = step1;
}
int main()
{
	int i, j, k;
	while( scanf("%d", &n) != EOF && n)
	{
		for(i = 0; i < n; ++i)
		for(j = 0; j < n; ++j)
		scanf("%d", &dis[i][j]);
		scanf("%d", &m);
		memset(sta, 0, sizeof(sta));
		num = 0;
		for(i = 0; i < m; ++i)
		{
			scanf("%d", &j);
			if(!sta[j])
			num++;
			sta[j] = 1;
		}
		min = 100000000;
		memset(vis , 0, sizeof(vis));
		vis[0] = 1;
		step1 = 0;
		step2 = 0;
		dfs(0);
		printf("%d\n", min);
	}
	return 0;
}


题意:给出几个站点之间的距离,并且给出要停的站点,求从起点并且将所有站点走完的最小距离。

思路:深搜,从0起点开始遍历,并且每到一个点就将距离加入到一个临时变量中,若将所有的站点都走完了,则记录最小的距离,直至遍历完所有的可能。

你可能感兴趣的:(Hduoj1572【DFS】)