小白发问:栈溢出要怎么处理?

看看这是啥问题嘛,标有红色叉的说是栈溢出了,但我怎么改还是这样啊

img

img

以下是全部代码

#include <fstream>
#include <sstream>
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
#define max 100000
string name[1000];
int map[1000][1000];
int i, j, v1, v2, u, min;
int s[1000], d[1000], p[1000];
void shuchu(int v1, int v2)
{
    int a[1000] = { 0 };
    int k = 0;
    k = v2;i = 1;
    while (k != v1)
    {
        i++;
        a[i] = k;
        k = p[k];
    }
    i++;
    a[i] = v1;
    u = i;
    cout << endl;
    cout << name[v1] << "->" << name[v2] << "的最短路径长度是:" << d[v2] << "米" << endl;
    if (u > 2)
    {
        cout << "具体路径是:" << endl;
        for (i = u;i > 2;i--)
            cout << name[a[i]] << "->" << name[a[i - 1]] << ":" << map[a[i]][a[i - 1]] << "米" << endl;
    }
}
void dijkstra(int v1, int v2)
{
    for (i = 1;i <= 14;i++)
    {
        s[i] = 0;
        d[i] = map[v1][i];
        if (d[i] < max) p[i] = v1;
        else p[i] = -1;
    }
    s[v1] = 1;d[v1] = 0;
    for (i = 1;i <= 14;i++)
    {
        min = max;
        for (j = 1;j <= 14;j++)
        {
            if (s[j] == 0 && d[j] < min)
            {
                i = j;min = d[j];
            }
        }
        s[i] = 1;
        for (j = 1;j <= 14;j++)
        {
            if (s[j] == 0 && (d[i] + map[i][j] < d[j]))
            {
                d[j] = d[i] + map[i][j];
                p[j] = i;
            }
        }
    }
}
int main()
{

    cout << "      ==================== 广东外语外贸大学校园导航 ======================     " << endl;
    cout << "      =                                                                  =     " << endl;
    cout << "      =   1. 1饭     2. 2饭     3. 3饭        4.南苑        5. 北苑      =     " << endl;
    cout << "      =   6. 师苑    7. 又康    8. 门诊部     9. 教学区     10. 图书馆   =     " << endl;
    cout << "      =   11. 实验楼 12. 体育场 13. 篮球场    14. 校办公室   0. 退出     =     " << endl;
    cout << "      =                                                                  =     " << endl;
    cout << "      ====================================================================     " << endl;

    cout << endl;

    name[1] = "1饭";
    name[2] = "2饭";
    name[3] = "3饭";
    name[4] = "南苑";
    name[5] = "北苑";
    name[6] = "师苑";
    name[7] = "又康";
    name[8] = "门诊部";
    name[9] = "教学区";
    name[10] = "图书馆";
    name[11] = "实验楼";
    name[12] = "体育场";
    name[13] = "篮球场";
    name[14] = "校办公室";

    for (i = 1;i <= 14;i++)
        for (int j = 1;j <= 14;j++)
        {
            if (i == j)
                map[i][j] = 0;
            else
                map[i][j] = max;
        }

    string filename;
    filename = R"(D:\zuoye\duru.txt)";
    ifstream fin(filename, ios::in);
    if (fin.is_open() == false)
    {
        cout << "打开文件" << filename << "失败。" << endl;
        return 0;
    }
    int n, m, y;
    while (!fin.eof())
    {
        fin >> n >> m >> y;
        map[n][m] = map[m][n] = y;
    }

    cout << "请输入起点:";
    cin >> v1;
    if (v1 == 0)
    {
        cout << endl;
        cout << "欢迎下次使用!" << endl;
    }
    else 
    {
        cout << "请输入终点:";
        cin >> v2;
        dijkstra(v1, v2);
        shuchu(v1, v2);
    }
    fin.close();
    return 0;
}

打印出来 i 的值,检查这些变量都是如何变化的。

有两个问题:
第一,dijkstra函数那边第二个循环中的变量i被错误地赋值为j;
第二,使用了全局变量和宏定义,没有对输入进行有效性检查。
下面是修正后的代码:

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

const int maxn = 1000;
const int inf = 0x3f3f3f3f;

vector<string> name(maxn);
vector<vector<int>> map(maxn, vector<int>(maxn));
vector<int> s(maxn), d(maxn), p(maxn);

void shuchu(int v1, int v2) {
    vector<int> a(maxn);
    int k = v2, i = 1;
    while (k != v1) {
        i++;
        a[i] = k;
        k = p[k];
    }
    i++;
    a[i] = v1;
    int u = i;
    cout << endl;
    cout << name[v1] << "->" << name[v2] << "的最短路径长度是:" << d[v2] << "米" << endl;
    if (u > 2) {
        cout << "具体路径是:" << endl;
        for (i = u; i > 2; i--)
            cout << name[a[i]] << "->" << name[a[i - 1]] << ":" << map[a[i]][a[i - 1]] << "米" << endl;
    }
}

void dijkstra(int v1, int v2) {
    for (int i = 1; i <= 14; i++) {
        s[i] = 0;
        d[i] = map[v1][i];
        if (d[i] < inf)
            p[i] = v1;
        else
            p[i] = -1;
    }
    s[v1] = 1;d[v1] = 0;
    for (int i = 1; i <= 14; i++) {
        int minv = inf, u;
        for (int j = 1; j <= 14; j++) {
            if (s[j] == 0 && d[j] < minv) {
                u = j;minv = d[j];
            }
        }
        s[u] = 1;
        for (int j = 1; j <= 14; j++) {
            if (s[j] == 0 && (d[u] + map[u][j] < d[j])) {
                d[j] = d[u] + map[u][j];
                p[j] = u;
            }
        }
    }
}

int main() {

    cout << "      ==================== 广东外语外贸大学校园导航 ======================     " << endl;
    cout << "      =                                                                  =     " << endl;
    cout << "      =   1. 1饭     2. 2饭     3. 3饭        4.南苑        5. 北苑      =     " << endl;
    cout << "      =   6. 师苑    7. 又康    8. 门诊部     9. 教学区     10. 图书馆   =     " << endl;
    cout << "      =   11. 实验楼 12. 体育场 13. 篮球场    14. 校办公室   0. 退出     =     " << endl;
    cout << "      =                                                                  =     " << endl;
    cout << "      ====================================================================     " << endl;

    cout << endl;

    name[1] = "1饭";
    name[2] = "2饭";
    name[3] = "3饭";
    name[4] = "南苑";
    name[5] = "北苑";
    name[6] = "师苑";
    name[7] = "又康";
    name[8] = "门诊部";
    name[9] = "教学区";
    name[10] = "图书馆";
    name[11] = "实验楼";
    name[12] = "体育场";
    name[13] = "篮球场";
    name[14] = "校办公室";

    for (int i = 1; i <= 14; i++)
        for (int j = 1; j <= 14; j++) {
            if (i == j)
                map[i][j] = 0;
            else
                map[i][j] = inf;
        }

    string filename;
    filename = R"(D:\zuoye\duru.txt)";
    ifstream fin(filename, ios::in);
    if (fin.is_open() == false) {
        cout << "打开文件" << filename << "失败。" << endl;
        return 0;
    }
    int n, m, y;
    while (!fin.eof()) {
        fin >> n >> m >> y;
        map[n][m] = map[m][n] = y;
    }

    cout << "请输入起点:";
    cin >> v1;
    if (v1 == 0) {
        cout << endl;
        cout << "欢迎下次使用!" << endl;
    } else {
        cout << "请输入终点:";
        cin >> v2;
        dijkstra(v1, v2);
        shuchu(v1, v2);
    }
    fin.close();