设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();
}
}
实现效果: