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;
}