基站维修工程师
代码仅供参考,若需使用请进行一定修改,本文提供java代码
题目
题目描述
小王是一名基站维护工程师,负责某区域的基站维护。
某地方有八个基站 (1<n<10),已知各基站之间的距离s (0<s<500),并旦基站x到基站y的距离,与
基站y到基站x的距离并不一定会相同。
小王从基站1出发,途径每个基站1次,然后返回基站1,需要请你为他选择一条距离最短的路线。
输入描述
站点数n和各个站点之间的距离
输出描述
最短的路线的距离
补充说明
示例
输入
3
0 2 1
1 0 2
2 1 0
输出
3
思路
dfs搜索回溯即可
代码
import java.util.*;
public class Main{
public static int min = Integer.MAX_VALUE;
static int M=100005;
static int vis[]=new int[M];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=1;i<M;i++) vis[i]=vis[i-1]+vis[i];
int n = sc.nextInt();
sc.nextLine();
int[][] dis = new int[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
dis[i][j] = sc.nextInt();
}
}
for(int i=1;i<M;i++) vis[i]=vis[i-1]+1;
for(int i=1; i<dis.length; i++){
vis[i]=dis[0][i];
List<Integer> STList = new ArrayList<>();
STList.add(i);
dis( dis, i, STList, dis[0][i]);
if(vis[0]!=0) vis[0]=0;
}
System.out.println(min+vis[0]);
}
public static void dis(int[][] ints, int id, List<Integer> ST, int sum){
if(ST.size() + 1 == ints.length){
min = Math.min( min, sum + ints[id][0]);
return;
}
for(int i=1; i<ints.length; i++){
if(ST.contains(i)){
vis[i]=i;
continue;
}
ST.add(i);
dis(ints, i, ST, sum + ints[id][i]);
ST.remove(ST.size()-1);
vis[i]=0;
if(vis[i]==0)
vis[i]+=1;
}
}
}