Dijsktra算法结果出错：terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid

what(): basic_string::_S_construct null not valid

``````#include <iostream>
#include <sstream>
#include <string.h>
#include <vector>
#include<fstream>
#define MaxInt 32767                                        //表示极大值，即∞
#define MVNum 100                                           //最大顶点数
using namespace std;
typedef int ArcType;                                        //假设边的权值类型为整型

int *D=new int[MVNum];                                      //用于记录最短路的长度
bool *S=new bool[MVNum]();                                      //标记顶点是否进入S集合S={};
int *Path=new int[MVNum];                                   //用于记录最短路顶点的前驱

//------------图的顶点结构-----------------
typedef struct{
char name[100];
char info[1000];
}VertexType; //顶点结构

//------------图的邻接矩阵-----------------
typedef struct{
VertexType vexs[MVNum];                                 //顶点表
ArcType arcs[MVNum][MVNum];                             //邻接矩阵
int vexnum,arcnum;                                      //图的当前点数和边数
}AMGraph;

int LocateVex(AMGraph G , string vname){
//确定点v在G中的位置
for(int i = 0; i < G.vexnum; ++i)
if(G.vexs[i].name== vname)
return i;
return -1;
}//LocateVex

//定义字符串分割函数
vector<string> split(const string& str, const string& delim) {
vector<string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str());

char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());

char *p = strtok(strs, d);
while(p) {
string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL,d);
}

return res;
}

void CreateUDN(AMGraph &G,char filename[]){
//采用邻接矩阵表示法，创建无向网G
FILE *in;
char *ch=new char[1000];
char* s;
vector<string> res;
if((in=fopen(filename,"r"))==NULL){
cout<<"无法打开graph文件！"<<endl;
exit(0);
}
//读取总顶点数，总边数
fgets(s,1000,in);
res=split(s, " ");
stringstream ss,kk;
ss<<res[0];
ss>>G.vexnum;
cout<<G.vexnum<<endl;
kk<<res[1];
kk>>G.arcnum;
cout<<G.arcnum<<endl;
//读取顶点信息
for(int i=0;i<G.vexnum;i++){
fgets(s,1000,in);
res=split(s, " ");
strcpy(G.vexs[i].name, res[0].c_str());
strcpy(G.vexs[i].info, res[1].c_str());
}
//读取边的信息
int m,n;
for(int i=0;i<G.arcnum;i++){
stringstream zz;
fgets(s,1000,in);
res=split(s, " ");
m = LocateVex(G, res[0]);  n = LocateVex(G, res[1]);        //确定两个顶点在G中的位置，即顶点数组的下标
zz<<res[2];
zz>>G.arcs[m][n];                                   //设置边的权重
G.arcs[n][m] = G.arcs[m][n];
zz.str("");
}
fclose(in);
}//CreateUDN

void ShortestPath_DIJ(AMGraph G, int v0){
//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
int v , i , w , min;
int n = G.vexnum;                                       //n为G中顶点的个数

for(v = 0; v < n; ++v){                                 //n个顶点依次初始化
S[v] = false;                                       //S初始为空集
D[v] = G.arcs[v0][v];                               //将v0到各个终点的最短路径长度初始化为弧上的权值
if(D[v] < MaxInt)  Path [v] = v0;                   //如果v0和v之间有弧，则将v的前驱置为v0
else Path [v] = -1;                                 //如果v0和v之间无弧，则将v的前驱置为-1
}//for

S[v0]=true;                                             //将v0加入S
D[v0]=0;                                                //源点到源点的距离为0

/*―初始化结束，开始主循环，每次求得v0到某个顶点v的最短路径，将v加到S集―*/
for(i = 1;i < n; ++i){                                  //对其余n-1个顶点，依次进行计算
min= MaxInt;
for(w = 0; w < n; ++w)
if(!S[w] && D[w] < min){                        //选择一条当前的最短路径，终点为v
v = w;
min = D[w];
}//if
S[v]=true;                                          //将v加入S
for(w = 0;w < n; ++w)                               //更新从v0出发到集合V?S上所有顶点的最短路径长度
if(!S[w] && (D[v] + G.arcs[v][w] < D[w])){
D[w] = D[v] + G.arcs[v][w];                 //更新D[w]
Path [w] = v;                               //更改w的前驱为v
}//if
}//for
}//ShortestPath_DIJ

void DisplayPath(AMGraph G, int begin,int temp ){
//显示最短路
//cout<<Path[temp]<<endl;
if(Path[temp] != -1){
DisplayPath(G, begin,Path[temp]);
cout<<G.vexs[Path[temp]].name<<"-->";
}

}//DisplayPath

int main()
{
//cout << "************算法6.10　迪杰斯特拉算法**************" << endl << endl;
AMGraph G;
int i , j ,fuwu,jd,start, destination;
char f1[]={"graph.txt"};
CreateUDN(G,f1);
cout <<endl;
cout << "*****无向网G创建完成！*****" << endl;

for(i = 0 ; i < G.vexnum ; ++i){
for(j = 0; j < G.vexnum; ++j){
if(j != G.vexnum - 1){
if(G.arcs[i][j] != MaxInt)
cout << G.arcs[i][j] << "\t";
else
cout << "∞" << "\t";
}
else{
if(G.arcs[i][j] != MaxInt)
cout << G.arcs[i][j] <<endl;
else
cout << "∞" <<endl;
}
}
}//for

cout << "************欢迎来到**************" << endl << endl;
cout << "         1.查询景点信息          "<<endl;
cout << "         2.问路查询              "<<endl;
cout << "         3.退出                  "<<endl;
cout<<"*****************请选择需要的服务(1-3)****************"<<endl;
cin>>fuwu;
switch(fuwu){
case 1:cout<<"本校景点有："<<endl;
for(i=0;i<G.vexnum;i++){
cout<<i<<":"<<G.vexs[i].name<<endl;
}
cout<<"请选择需要查询的景点"<<endl;
cin>>jd;
cout<<G.vexs[jd].info<<endl;
case 2:cout<<"本校景点有："<<endl;
for(i=0;i<G.vexnum;i++){
cout<<i<<":"<<G.vexs[i].name<<endl;
}
cout<<"请输入您的所在地"<<endl;
cin>>start;
cout<<"请输入您的目的地"<<endl;
cin>>destination;
ShortestPath_DIJ(G,start);
cout<<"路径是：";
DisplayPath(G,start,destination);
cout<<G.vexs[destination].name<<endl<<"最短距离是："<<endl;
cout<<D[destination]<<endl;
case 3: exit(0);
}
return 0;
}//main

``````

《MySQL 性能优化》之理解 MySQL 体系结构

【资源】一个C/C++开发工程师的学习路线（已经无路可退，唯有逆风飞翔）【内附资源页】

20道你必须要背会的微服务面试题，面试一定会被问到

【CSDN编者按】1月2日，阿里巴巴发布《达摩院2020十大科技趋势》，十大科技趋势分别是：人工智能从感知智能向认知智能演进；计算存储一体化突破AI算力瓶颈；工业互联网的超融合；机器间大规模协作成为可能；模块化降低芯片设计门槛；规模化生产级区块链应用将走入大众；量子计算进入攻坚期；新材料推动半导体器件革新；保护数据隐私的AI技术将加速落地；云成为IT技术创新的中心 。 新的画卷，正在徐徐展开。...

Python+OpenCV实时图像处理

2020年一线城市程序员工资大调查

python爬取百部电影数据，我分析出了一个残酷的真相
2019年就这么匆匆过去了，就在前几天国家电影局发布了2019年中国电影市场数据，数据显示去年总票房为642.66亿元，同比增长5.4%；国产电影总票房411.75亿元，同比增长8.65%，市场占比 64.07%；城市院线观影人次17.27亿，同比增长0.64%。 看上去似乎是一片大好对不对？不过作为一名严谨求实的数据分析师，我从官方数据中看出了一点端倪：国产票房增幅都已经高达8.65%了，为什...

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了????，这可都是提升你幸福感的高效率生产力工具哦！ 走起！???? NO、1 ScreenToGif 屏幕，摄像头和白板...

2020 年，大火的 Python 和 JavaScript 是否会被取而代之？
Python 和 JavaScript 是目前最火的两大编程语言，但是2020 年，什么编程语言将会取而代之呢？ 作者 |Richard Kenneth Eng 译者 |明明如月，责编 | 郭芮 出品 | CSDN（ID：CSDNnews） 以下为译文： Python 和 JavaScript 是目前最火的两大编程语言。然而，他们不可能永远屹立不倒。最终，必将像其他编程语言一...

AI 没让人类失业，搞 AI 的人先失业了

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

B站是个宝，谁用谁知道???? 作为一名大学生，你必须掌握的一项能力就是自学能力，很多看起来很牛X的人，你可以了解下，人家私底下一定是花大量的时间自学的，你可能会说，我也想学习啊，可是嘞，该学习啥嘞，不怕告诉你，互联网时代，最不缺的就是学习资源，最宝贵的是啥？ 你可能会说是时间，不，不是时间，而是你的注意力，懂了吧！ 那么，你说学习资源多，我咋不知道，那今天我就告诉你一个你必须知道的学习的地方，人称...

loonggg读完需要2分钟速读仅需 1 分钟大家我，我是你们的校长。前几天，搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单，就是搜狐出了“考勤新规”。一封搜狐对员工发布...

【蘑菇街技术部年会】程序员与女神共舞，鼻血再次没止住。（文末内推）

Java校招入职华为，半年后我跑路了

​两年前不知如何编写代码的我，现在是一名人工智能工程师

loonggg读完需要5分钟速读仅需 2 分钟大家好，我是你们的校长。我知道大家在家里都憋坏了，大家可能相对于封闭在家里“坐月子”，更希望能够早日上班。今天我带着大家换个思路来聊一个问题...

&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;meta http-equiv="X...
Spring框架|JdbcTemplate介绍

B 站上有哪些很好的学习资源?

【SpringBoot 系列】史上最全的springboot学习教程（会不断更新）