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

描述
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
 
输入
先输入一个小于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);
}


你可能感兴趣的:(用迪杰斯特拉算法求赋权图中的最短路径)