最短路径算法实现(Java版、C++版本)

设6个城市之间的一个航班网(图1)每条航线为图中的边,边上的权数表示该段航线的长度(单位:百公里),求出从城市到应选择哪一路径,使得费用最省。


一、C++实现

#include<iostream> 
#include<vector> 
#include<string> 
#include<cmath>
using namespace std; 


#define MAX_VEX_NUM 20
vector<string> allPath;  
vector<int> all;  
struct MGraph 

char vexs[MAX_VEX_NUM]; 
int vexnum;
int arcnum; 
int arcs[MAX_VEX_NUM][MAX_VEX_NUM];
}; 
MGraph G; 
int Locatevex(MGraph G ,char v)

int i=0; 
while(i<G .vexnum && v!=G .vexs[i]) 
i++; 
if(i<G .vexnum) 
return i;
else 
return -1; 

 
int CreateUDG(MGraph &G) 

char v1,v2;  
int weight;
cin>>G.vexnum>>G .arcnum;
if(G.vexnum>1000 &&G .arcnum>2000000){
return -1;
}
//这里可以输入顶点自身权重(顶点自身的值,不是给他的标号) 
for(int i=0;i<G .vexnum;i++)
   G.vexs[i]='1'+i; 
for(int q=0;q<G .vexnum;q++)
for(int p=0;p<G .vexnum;p++) 
   G.arcs[q][p]=0; 
for(int k=0;k<G .arcnum;k++)
{
cin>>v1>>v2>>weight;
if(weight>100000){
return -1;
}  
int a=Locatevex(G ,v1); 
int b=Locatevex(G ,v2); 
 
G.arcs[a][b]=weight; //修改部分 
G.arcs[b][a]=G .arcs[a][b]; 

return 1; 
}
void Minway(MGraph G ,bool *visited,char vexs,int Long,char vb,string path)  

if(vexs==vb)  

path=path+" "+vexs; 
allPath.push_back(path);  
all.push_back(Long);  

else 

path=path+" "+vexs; 
int i=Locatevex(G ,vexs); 
visited[i]=true; 
for(int j=0;j<G .vexnum;j++) 
if((!visited[j])&&(G .arcs[i][j]!=0)) 

Minway(G ,visited,G .vexs[j],Long+G .arcs[i][j],vb,path);  

visited[i]=false; 


void CountMinway(MGraph G)  

char va='1';
char vb='0'+G.vexnum; 
string path;  
int i=Locatevex(G ,va); 
bool visited[100]; 
for(int j=0;j<G .vexnum;j++) 
visited[j]=false;  
visited[i]=true;  
int Long=0; 
path+=va; 
for(int j=0;j<G .vexnum;j++) 
if(G.arcs[i][j]!=0) 

Long=G .arcs[i][j]; 
Minway(G ,visited,G.vexs[j],Long,vb,path); 

cout<<endl; 

void Minway()

int min=10000; 
for(int i=0;i<allPath.size();i++)
if(all[i]<min) 
min=all[i]; 
for(int j=0;j<allPath.size();j++)
if(all[j]==min) 
cout<<all[j]<<endl; 
cout<<endl; 

int main() 

CreateUDG(G);  
CountMinway(G);  
Minway();
return 0;

实现效果:


二、Java版实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class Dijkstra {
private static int MAX_VEX_NUM=20;
private static List<String> allpath=new ArrayList<String>();
private static List<Integer> all=new ArrayList<Integer>();
  
public class MGraph{
public int vexnum;
public int arcnum;
char[] vexs=new char[MAX_VEX_NUM];
int[][] arcs=new int[MAX_VEX_NUM][MAX_VEX_NUM];
}

    public static int Locatevex(MGraph G ,char v){
    int i=0;
    while(i<G.vexnum &&v!=G.vexs[i])
    i++;
    if(i<G.vexnum){
    return i;
    }else{
    return -1;
    }
    }
    
    public static int CreateUDG(MGraph G){
    char v1,v2;  
    int weight;
    Scanner sc=new Scanner(System.in);
    String s1=sc.nextLine();
    String[] ss=s1.split(" ");
    G.vexnum=Integer.parseInt(ss[0]);
    G.arcnum=Integer.parseInt(ss[1]);
    if(G.vexnum>1000 &&G .arcnum>2000000){
    return -1;
    }
    for(int i=0;i<G .vexnum;i++)
       G.vexs[i]=(char) ('1'+i); 
    for(int q=0;q<G .vexnum;q++)
    for(int p=0;p<G .vexnum;p++) 
       G.arcs[q][p]=0; 
    for(int k=0;k<G .arcnum;k++)
    {
    String str=sc.nextLine();
    String[] st=str.split(" ");
    v1=st[0].toCharArray()[0];
    v2=st[1].toCharArray()[0];
    weight=Integer.parseInt(st[2]);
    if(weight>100000){
    return -1;
    }  
    int a=Locatevex(G ,v1); 
    int b=Locatevex(G ,v2); 
     
    G.arcs[a][b]=weight; 
    G.arcs[b][a]=G .arcs[a][b]; 
    } 
    return 1; 
    }
    public static void Minway(MGraph G,boolean[] visited,char vexs,int Long,char vb,String path){
    if(vexs==vb)  
    { 
    path=path+" "+vexs; 
    allpath.add(path);  
    all.add(Long);  
    } 
    else 
    { 
    path=path+" "+vexs; 
    int i=Locatevex(G ,vexs); 
    visited[i]=true; 
    for(int j=0;j<G .vexnum;j++) 
    if((!visited[j])&&(G .arcs[i][j]!=0)) 
    { 
    Minway(G ,visited,G .vexs[j],Long+G .arcs[i][j],vb,path);  
    } 
    visited[i]=false; 
    } 
    }
    public static void CountMinway(MGraph G)  
    { 
    char va='1';
    char vb=(char) ('0'+G.vexnum); 
    String path = null;  
    int i=Locatevex(G ,va); 
    boolean[] visited=new boolean[100];; 
    for(int j=0;j<G .vexnum;j++) 
    visited[j]=false;  
    visited[i]=true;  
    int Long=0; 
    path+=va; 
    for(int j=0;j<G .vexnum;j++) 
    if(G.arcs[i][j]!=0) 
    { 
    Long=G .arcs[i][j]; 
    Minway(G ,visited,G.vexs[j],Long,vb,path); 
    } 
    System.out.println();
    } 
    public static void Minway()
    { 
    int min=10000; 
    for(int i=0;i<allpath.size();i++)
    if(all.get(i)<min) 
      min=all.get(i); 
    for(int j=0;j<allpath.size();j++)
    if(all.get(j)==min) 
    System.out.println(all.get(j));
    System.out.println();
    } 
    public static void main(String[] args) {
    Dijkstra d=new Dijkstra();
    Dijkstra.MGraph G=d.new MGraph();
    CreateUDG(G);  
    CountMinway(G);  
    Minway();
}
}

实现效果:






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值