今天做了什么:

迪杰斯特拉算法

它是一种单源最短路径算法,用于解决有权图(即图中每条边都有一个权重值)中的最短路径问题。
该算法采用贪心策略,从起始点开始,逐步寻找与起始点相连且距离最短的节点,并将其加入已找到最短路径的节点集合中。
在每一步中,算法都会更新与当前已找到最短路径节点相连的其他节点的距离值,以确保找到的是真正的最短路径。

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@WebServlet("/select")
public class selectservlet extends HttpServlet {
int a=0;
String [] visit;
int[] visit2;
List<String> list3=new ArrayList<>();
@Override
protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String s="";
String start=request.getParameter("start");
String end=request.getParameter("end");
Dao dao=new Dao();
List<String> list=new ArrayList<>();
list=dao.transelect();
a= list.size()+2;
visit =new String[list.size()+2];
int[] visit1 =new int[list.size()+2];
visit2=new int[list.size()+2];
int[] dist =new int[list.size()+2];
int[][] dist1 =new int[list.size()+2][list.size()+2];
visit[0]=start;visit[list.size()+1]=end;
visit1[0]=1;
int v=1,minid=0;
System.out.println(visit[0]);
for (String tran:list) {
visit[v]=tran;
v++;
System.out.println(tran+"tran");
// System.out.println(list.size());
}
for (int i=0;i<list.size()+2;i++){
for (int j=0;j<list.size()+2;j++){
dist1[i][j]= dao.sum(visit[i],visit[j]);
//System.out.println(dist1[i][j]+visit[i]+visit[j]);
}
}
for (int i=0;i<list.size()+2;i++){
for (int j=0;j<list.size()+2;j++){
//dist1[i][j]= dao.sum(visit[i],visit[j]);
//System.out.println(dist1[i][j]+visit[i]+visit[j]);
}
}
for(int j=0;j<list.size()+2;j++){
dist[j]=dist1[0][j];
//System.out.println(dist[j]+"尼玛555");
}
String l=visit[0];
int minddle1=0;
for (int j=0;j<list.size()+2;j++){
int min=200,minddle=0;
for (int i=0;i<list.size()+2;i++){
if (visit1[i]==0&&min>dist[i]){
min=dist[i];
minddle=i;
}
}
for (int i=0;i< list.size()+2;i++){
if (visit1[i]==0&&dist[i]>dist[minddle]+dist1[minddle][i]){
dist[i]=dist[minddle]+dist1[minddle][i];
visit2[i]=minddle;
}
}
visit1[minddle]=1;
System.out.println(visit[minddle]+"999999");
if (!visit[minddle].equals(visit[0])){
l=l+visit[minddle];
}
}
System.out.println(dist[list.size()+1]+"结果"+l);
// for (int i=0;i<list.size()+2;i++){
// for(int j=0;j< list.size()+2;j++){
// System.out.println(visit[i]+" "+visit[j]+" "+dist1[i][j]);
// }
// }
for (int i=0;i<list.size()+2;i++){

a=dist[list.size()+1];
System.out.println(visit[visit2[i]]+"历经");
}
list3.add(end);
List<String> list1=new ArrayList<>();
list1=(getA(list.size()+1));
for (String a:
list1) {
System.out.println(a+"99999999999999999");
}
List<String> mount=new ArrayList<>();
for (int i=0;i+1<list1.size();i++){
System.out.println(list1.get(i)+"000");
List<String> list2=new ArrayList<>();
list2=dao.getpoints(list1.get(i),list1.get(i+1));
if (list2.get(0).equals("换乘")){
for (int m=list2.size();m>1;m--){
// if (m==1){
// mount.add(list2.get(m-1)+"-->换乘-->");
// }
// else{
mount.add(list2.get(m-1)+"-->");
// }
}
mount.add("换乘-->");
}
else {
for (int m=1;m<list2.size();m++){
mount.add(list2.get(m)+"-->");
}
mount.add("换乘-->");
}

}
for(int i=mount.size()-1;i>=0;i--){
if (mount.get(i).equals("换乘-->")&&i==mount.size()-1){
continue;
}
s=s+mount.get(i);
}
// for (String a:
// mount) {
// s=s+a;
// System.out.println(a);
// }

request.setAttribute("visit","经过站数:"+dist[list.size()+1]+" 路线:"+s);
s="";
request.setAttribute("stend",start+end);
request.getRequestDispatcher("select.jsp").forward(request,resp);

}
public List<String> getA(int i){


if (i>0){
list3.add(visit[visit2[i]]);
getA(visit2[i]);
}
return list3;
}
}

遇到了什么困难:

地接斯塔拉算法中前驱和后继的节点记录有些混乱

明天准备做什么:

python

代码量 200行