用迪杰斯特拉算法求赋权图中的最短路径

来源:互联网 发布:mac安装战网失败 编辑:程序博客网 时间:2024/06/05 14:42
描述
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
 
输入
先输入一个小于100的正整数n,然后的n行输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点,
 
输出
用迪杰斯特拉算法求第一个点到其余所有结点的最短路径。
并输出这两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
 
输入样例
4
0 2 10 10000
2 0 7 3
10 7 0 6
1000 3 6 0
0 2
 
输出样例
0
1

2


#include <iostream>#include <cstdio>#include <cstring>#include <stack>#include <stdlib.h>using namespace std;const int maxnum = 130;const int maxint = 10000;void Dijkstra(int n, int v, int *dist, int *prev, int matrix[maxnum][maxnum]){    bool visited[maxnum];    int i, j;    for(i = 1; i <= n; i++)    {        dist[i] = matrix[v][i];        visited[i] = 0;        if(dist[i] == maxint)            prev[i] = 0;        else            prev[i] = v;    }    dist[v] = 0;    visited[v] = 1;    // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中    // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度    for(i = 2; i <= n; i ++)    {        int temp = maxint;        int u;        for(j = 1; j <= n; j++)        {            if((visited[j]==0)&&(dist[j]<temp))            {                u = j;                temp = dist[j];            }        }        visited[u] = 1;        for(j = 1; j <= n; j++)        {            if((visited[j]==0)&&(matrix[u][j]<maxint))            {                int newdist = dist[u]+matrix[u][j];                if(newdist<dist[j])                {                    dist[j] = newdist;                    prev[j] = u;                }            }        }    }}void searchPath(int *prev, int u, int v){    stack<int>s;    while(v!=u){s.push(v);v = prev[v];}s.push(v);    while(!s.empty())    {        cout << s.top()-1 << endl;        s.pop();    }}int main(){    //freopen("test.txt", "r", stdin);    int dist[maxnum];    int prev[maxnum];    int matrix[maxnum][maxnum];    int n;    cin >> n;    int i, j;    for(i = 1; i <= n; i++)    {        for(j = 1; j <= n; j ++)        {            cin >> matrix[i][j];        }    }    int x, y;    cin >> x >> y;    Dijkstra(n, x+1, dist, prev, matrix);//    for(i = 1; i <= n; i++)//        printf("%d%c", dist[i], i == n?'\n':' ');    searchPath(prev, x+1, y+1);}


0 0
原创粉丝点击