import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int x = s.nextInt();
int[][] temp = new int[x+1][x+1];
int[] atemp =new int [x+1];
int[] btemp =new int [x+1];
atemp[0] = 0;
btemp[0] = 0;
for(int i =0;i<x;i++){
Scanner s2 = new Scanner(System.in);
String str = s2.nextLine();
atemp[i+1]=Integer.parseInt(str.substring(0, 1));
btemp[i+1]=Integer.parseInt(str.substring(2, 3));
}
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= x; j++) {
int a = (atemp[i]-atemp[j])>=0?(atemp[i]-atemp[j]):-(atemp[i]-atemp[j]);
int b = (btemp[i]-btemp[j])>=0?(btemp[i]-btemp[j]):-(btemp[i]-btemp[j]);
temp[i][j]=a+b;
}
}
TSP problem=new TSP(temp);
System.out.println(problem.bestCost);
}
}
class TSP{
int vexnum=0;//顶点数目
int adjMatrix[][];
TSP(int[][] adjMat){
adjMatrix=adjMat;
vexnum=adjMatrix.length;
int init[]={0};
Backtrack(1,init);
int a;
a=0;
}
int bestCost=0;
int[] bestX;//最优解向量
boolean isTraverseDeep=false;
void Backtrack(int t,int[] x){
if(t>=vexnum){
x[t]=0;
constraint(x,t);
}else{
int i,j;
int cx[]=new int[vexnum+1];
for(j=0;j<t;j++) cx[j]=x[j];
cx[t]=t;
if(constraint(cx,t)) Backtrack(t+1,cx);
for(i=1;i<t;i++){
cx=new int[vexnum+1];
for(j=0;j<t;j++) cx[j]=x[j];
cx[t]=t;
swap(cx,i,t);
if(constraint(cx,t)) Backtrack(t+1,cx);
}
}
}
boolean constraint(int[] x,int len){
int cost=0;
int i;
int pre=x[0];
for(i=1;i<=len;i++){
int dist=adjMatrix[pre][x[i]];
if(dist<=0) return false;
cost+=dist;
pre=x[i];
}
if(isTraverseDeep){
if(cost<bestCost){
if(len==vexnum){
bestCost=cost;
bestX=x;
}
return true;
}else return false;
}else if(len==vexnum){
bestCost=cost;
bestX=x;
isTraverseDeep=true;
return true;
}
return true;
}
private void swap(int[] nums,int a,int b){
int tmp=nums[a];
nums[a]=nums[b];
nums[b]=tmp;
}
}
哪一个公司的就不合适说了,用了回溯法。