最短网络——DFS解决

Description
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 
约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。 
为了用最小的消费,他想铺设最短的光纤去连接所有的农场。 
你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。

Input
该题含有多组测试数据。 
第一行为M表示有M组测试数据。 
每组数据第一行为农场的个数,N(3<=N<=100)。 
接下去为一个N*N的矩阵,表示每个农场之间的距离。(农场之间的距离小于100000)

Output
每组数据只有一个输出,其中包含连接到每个农场的光纤的最小长度。

Sample Input
1
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

 

Sample Output
28

#include <iostream>
using namespace std;

int startPosition, visited[10], martrix[25][25], m;
int min_dis = 999999;
int Point();//求一共经过了几个点
void Dfs(int v, int distance);
int main()
{
	cin >> m;
	for (int i = 1;i <= m;i++)
	{
		for (int j = 1;j <= m;j++)
		{
			int length;
			cin >> length;
			martrix[i][j] = length;
		}
	}
	for (int i = 1;i <= m;i++)//在不同的点出发遍历整个图的距离不同,因此要分四次来算。
	{
		startPosition = i;
		visited[i] = 1;
		Dfs(i, 0);
		visited[i] = 0;
	}
	cout << min_dis;
	return 0;
}
void Dfs(int v, int distance)
{
	if (Point() == 4)
	{
		if (min_dis > distance)
		{
			min_dis = distance;
		}
		return;
	}
	for (int i = 1; i <= m; i++)
	{
		if (martrix[v][i] != 0 && visited[i] == 0)
		{
			visited[i] = 1;
			Dfs(i, distance + martrix[v][i]);
			visited[i] = 0;
		}
	}
}
int Point()//此处也可直接向函数中传一个times 记录经过了几个点。
{
	int times = 0;
	for (int i = 1;i <= m;i++)
	{
		if (visited[i] == 1)
		{
			times++;
		}
	}
	return times;
}


猜你喜欢

转载自blog.csdn.net/geek_sun/article/details/80555463