电工杯B题小代码

第一问的遍历所有地点的最短路径

代码一:Lingo

model:
n=14; %总共个点14 A=zeros(n,n);
for i=1:n
 for j=1:n
 if(i==j) A(i,j)=0;
 else A(i,j)=100000;
 end
 end
end
A(1,5)=54;A(1,7)=55;A(1,11)=26;A(2,3)=56;A(2,5)=18;A(3,5)=44;A(4,6)=28;
A(5,6)=51;A(5,7)=34;A(5,8)=56;A(5,9)=48;A(6,9)=27;A(6,10)=42;A(7,8)=36;
A(7,12)=38;A(8,9)=29;A(8,12)=33;A(9,10)=61;A(9,12)=29;A(9,13)=42;A(9,14)=36;
A(10,14)=25;A(11,12)=24;A(13,14)=47;
for j=1:n
for i=1:j-1 A(j,i)=A(i,j); %使对称 end
end
[m,n]=size(A);
B=zeros(m,n);
B=A;
%利用 Floyd 算法计算最短距离矩阵 for k=1:n
 for i=1 :n
 for j=1:n
 t=B(i,k)+B(k,j);
 if t<B(i,j) B(i,j)=t; end
 end
 end
end
%输出距离矩阵 fid=fopen('distance.txt','w');
 for i=1:n
 for j=1:n
fprintf(fid,'%4d ',B(i,j));
 end
 fprintf(fid,'\n');
 end
 fclose(fid);
%初始数据%
D=[0 72 98 133 54 54 55 83 79 140 26 50 121 115
   72 0 56 97 18 69 52 74 66 111 98 90 108 102
   98 56 0 123 44 95 78 100 92 137 124 116 134 128
   133 97 123 0 79 28 113 84 55 70 108 84 97 91
   54 18 44 79 0 51 34 56 48 93 80 72 90 84
   105 69 95 28 51 0 85 56 27 42 80 56 69 63
   55 52 78 113 34 85 0 36 65 126 62 38 107 101
   83 74 100 84 56 56 36 0 29 90 84 33 71 65
   79 66 92 55 48 27 65 29 0 61 53 29 42 36
   140 111 137 70 93 42 126 90 61 0 114 90 72 25
   26 98 124 108 80 80 62 57 53 114 0 24 95 89
   50 90 116 84 72 56 38 33 29 90 24 0 71 65
   121 108 134 97 90 69 107 71 42 72 95 71 0 47
   115 102 128 91 84 63 101 65 36 25 89 65 47 0];
L=size(D,1); %求出有几行即有几个城市D c=[9 1 2 3 4 5:6 7 8 10 11 12 13 14 9]; %选择初始圈 %改良圈%
for k=1:L
flag=0; %退出标志 for i=1:L-2
       for j=i+2:L
          if D(c(i),c(j))+D(c(i+1),c(j+1))<D(c(i),c(i+1))+D(c(j),c(j+1))
c(i+1:j)=c(j:-1:i+1); %替换圈原本的路径 flag=flag+1;
end %即i+1-之间的访问顺序没变j end
   end
   if flag==0
long=0;
       for n=1:L
          long =long+D(c(n),c(n+1));
end
circle=c;
break; end
end end

代码二:MATLAB

function [xl,l]=ljpj(d,q,zx) %dqzx %q
if length(q(:,1))>1
q=q';
end
k=length(q); %qzx
for i=1:k
if q(i)==zx
q(i:k-1)=q(i+1:k);
k=k-1;
end
end
q=q(1:k);%
y=zx;
for j=1:k
sum0=inf; %zu for i=1:k-j+1
if d(y,q(i))<sum0
sum0=d(y,q(i));
z=i;
end
end
u(j)=q(z);
y=q(z); %qu
for i=1:k-j+1
if i==z
if i==1
q=q(2:end);
else
q=[q(1:i-1) q(i+1:end)];
end
end
end
end % xl=[zx u zx]';
i=1;
while xl(i+1)==zx xl=xl(2:end);
end
l=0;
for i=1:length(xl)-1 l=l+d(xl(i),xl(i+1));
end

代码三:C++

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int N=20;
int dis[N][N]= {
   {0,INF,INF,INF,54,INF,55,INF,INF,INF,26,INF,INF,INF},
   {INF,0,56,INF,18,INF,INF,INF,INF,INF,INF,INF,INF,INF},
   {INF,56,0,INF,44,INF,INF,INF,INF,INF,INF,INF,INF,INF},
   {INF,INF,INF,0,INF,28,INF,INF,INF,INF,INF,INF,INF,INF},
   {54,18,44,INF,0,51,34,56,48,INF,INF,INF,INF,INF},
   {INF,INF,INF,28,51,0,INF,INF,27,42,INF,INF,INF,INF},
   {55,INF,INF,INF,34,INF,0,36,INF,INF,INF,38,INF,INF},
   {INF,INF,INF,INF,56,INF,36,0,29,INF,INF,33,INF,INF},
   {INF,INF,INF,INF,48,27,INF,29,0,61,INF,29,42,36},
    {INF,INF,INF,INF,INF,42,INF,INF,61,0,INF,INF,INF,25},
   {26,INF,INF,INF,INF,INF,INF,INF,INF,INF,0,24,INF,INF},
   {INF,INF,INF,INF,INF,INF,28,33,29,INF,24,0,INF,INF},
   {INF,INF,INF,INF,INF,INF,INF,INF,42,INF,INF,INF,0,47},
   {INF,INF,INF,INF,INF,INF,INF,INF,36,25,INF,INF,47,0},
};
int d[1<<N][N],vis[1<<N][N],s=9,t=9,n=14;
struct D {
int S,u,g;
   bool operator<(const D& b)const {return g<b.g;}
} pre[1<<N][N];
void printans(int S,int u) {
   if(!(u==s&&S==(1<<s)))printans(pre[S][u].S,pre[S][u].u);
   printf("%d ",u);
}
priority_queue<D> q;
int Dij() {
   memset(d,INF,sizeof d);
   memset(vis,0,sizeof vis);
   q.push({1<<s,s,0});
   d[1<<s][s]=0;
   while(!q.empty()) {
     int S=q.top().S,u=q.top().u,g=q.top().g;
     q.pop();
       if(g!=d[S][u])continue;
     for(int v=0; v<n; ++v) {
        int S2=S|(1<<v);
        if(d[S2][v]<=d[S][u]+dis[u][v])continue;
        d[S2][v]=g+dis[u][v];
        pre[S2][v]= {S,u};
        q.push({S2,v,d[S2][v]});
} }
   return d[(1<<n)-1][t];
}
int main() {
   printf("%d\n",Dij());
   printans((1<<n)-1,t);
   return 0;
}

上述三种求解电工杯B题第一问的代码,建议保存,以后求类似遍历所有地点的问题可以直接替换距离矩阵使用。


关注公众号,学习数学建模。 

猜你喜欢

转载自blog.csdn.net/weixin_52252897/article/details/125095516
今日推荐