自学内容网 自学内容网

最短路径C++,Dijkstra

Description

给出一个有向图(无负权值),求任意两点间的最短路径

Input

第一行为有向图中点的数量n(各点从0到n-1编号)第二行为边的数量m第三行为要求其间最短路径的两个点第四行起为m条边的信息,包括起点、终点和路径长度(保证长度是整数,且绝对值不大于100),以空格隔开

8

15

0 5

4 5 35

5 4 35

4 7 37

5 7 28

7 5 28

5 1 32

0 4 38

0 2 26

7 3 39

1 3 29

2 7 34

6 2 40

3 6 52

6 0 58

6 4 93

Output

求出输入中第三行两个点之间的最短路径长度并输出,比如上面的输入例子中,点0到点5间最短路径长度为73,则输出为:73

Sample Input 1 

8
15
0 5
4 5 35
5 4 35
4 7 37
5 7 28
7 5 28
5 1 32
0 4 38
0 2 26
7 3 39
1 3 29
2 7 34
6 2 40
3 6 52
6 0 58
6 4 93

Sample Output 1

73

Hint

保证n小于1000,且答案不超过 10^5.

来源:广西大学OJ

思路

最短路径有dijkstra和floyd算法,floyd算法时间复杂度是n的三次方,n小于10^5,显然超时,只能用dijkstra

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int dist[1000][1000];
int n, m, start, finish;
bool visited[1000];

void dijkstra() {
    // 初始化距离数组,除了起点到自身距离为0,其余为无穷大
    dist[start][start] = 0;

    for (int i = 0; i < n; ++i) {
        int minDist = INF, minIndex = -1;
        // 找到当前未访问节点中距离起点最近的节点
        for (int j = 0; j < n; ++j) {
            if (!visited[j] && dist[start][j] < minDist) {
                minDist = dist[start][j];
                minIndex = j;
            }
        }

        if (minIndex == -1) break;
        visited[minIndex] = true;

        // 更新与该节点相邻节点的距离
        for (int k = 0; k < n; ++k) {
            if (!visited[k] && dist[minIndex][k]!= INF) {
                int newDist = dist[start][minIndex] + dist[minIndex][k];
                if (newDist < dist[start][k]) {
                    dist[start][k] = newDist;
                }
            }
        }
    }
}

int main() {
    cin >> n;
    cin >> m;
    cin >> start >> finish;

    // 初始化邻接矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            dist[i][j] = INF;
        }
    }

    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        dist[u][v] = w;
    }

    dijkstra();
    cout << dist[start][finish] << endl;

    return 0;
}

floyd,超时了,可以参考

#include<bits/stdc++.h>
using namespace std;
int dist[1000][1000];
int n, m,start,finish;

void Floyd(int num) {
    for (int k = 0; k < num; k++) {
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {
                if (dist[i][j] > dist[i][k] + dist[k][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }
}

int main() {

    cin>>n;
    cin>>m;
    cin>>start>>finish;
    //初始化,不可达距离大于100(题目数据),到自己距离0
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i != j) {
                dist[i][j] = 101;
            } else {
                dist[i][j] = 0;
            }
        }
    }
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin>>u>>v>>w;
        dist[u][v] = w;
    }
    Floyd(n);
    cout<<dist[start][finish];
    return 0;
}


原文地址:https://blog.csdn.net/m0_74074965/article/details/144735875

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!