C语言最短路径

Python014

C语言最短路径,第1张

int main()

{

int G[100][100] = {}

//一个记录图的邻接矩阵

int a, b, w

//输入一共有7条边, 5个点

int i, j, k

for(i = 1i <= 5i++)

for(j = 1j <= 5j++)

G[i][j] = 9999999

for(i = 1i <= 7i++)

{

scanf("%d %d %d", &a, &b, &w)//输入每条边的信息,a和b代表这条边的两个顶点w代表两个点的距离

G[a][b] = w

G[b][a] = w

}

for(k = 1k <= 5k++)

for(i = 1i <= 5i++)

for(j = 1j <= 5j++)

if(G[i][j] >G[i][k] + G[k][j])

G[i][j] = G[i][k] + G[k][j]

printf("%d", G[1][4])//输出两点之间的最短路,这里的两个点是3和5

return 0

}

G[i][j]代表i到j的距离,甲,乙,丙,丁,戊用1,2,3,4,5代替

如果你还不懂的话,就看一些关于图论的问题,这个最短路是图论中的一个经典题

#include <iostream>

using namespace std

    

const int maxnum = 100

const int maxint = 999999

    

// 各数组都从下标1开始

int dist[maxnum]     // 表示当前点到源点的最短路径长度

int prev[maxnum]     // 记录当前点的前一个结点

int c[maxnum][maxnum]   // 记录图的两点间路径长度

int n, line             // 图的结点数和路径数

    

// n -- n nodes

// v -- the source node

// dist[] -- the distance from the ith node to the source node

// prev[] -- the previous node of the ith node

// c[][] -- every two nodes' distance

void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])

{

    bool s[maxnum]    // 判断是否已存入该点到S集合中

    for(int i=1i<=n++i)

    {

        dist[i] = c[v][i]

        s[i] = 0     // 初始都未用过该点

        if(dist[i] == maxint)

            prev[i] = 0

        else

            prev[i] = v

    }

    dist[v] = 0

    s[v] = 1

    

    // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中

    // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度

         // 注意是从第二个节点开始,第一个为源点

    for(int i=2i<=n++i)

    {

        int tmp = maxint

        int u = v

        // 找出当前未使用的点j的dist[j]最小值

        for(int j=1j<=n++j)

            if((!s[j]) &&dist[j]<tmp)

            {

                u = j              // u保存当前邻接点中距离最小的点的号码

                tmp = dist[j]

            }

        s[u] = 1    // 表示u点已存入S集合中

    

        // 更新dist

        for(int j=1j<=n++j)

            if((!s[j]) &&c[u][j]<maxint)

            {

                int newdist = dist[u] + c[u][j]

                if(newdist <dist[j])

                {

                    dist[j] = newdist

                    prev[j] = u

                }

            }

    }

}

    

// 查找从源点v到终点u的路径,并输出

void searchPath(int *prev,int v, int u)

{

    int que[maxnum]

    int tot = 1

    que[tot] = u

    tot++

    int tmp = prev[u]

    while(tmp != v)

    {

        que[tot] = tmp

        tot++

        tmp = prev[tmp]

    }

    que[tot] = v

    for(int i=toti>=1--i)

        if(i != 1)

            cout <<que[i] <<" ->"

        else

            cout <<que[i] <<endl

}

    

int main()

{

    freopen("input.txt", "r", stdin)

    // 各数组都从下标1开始

    

    // 输入结点数

    cin >>n

    // 输入路径数

    cin >>line

    int p, q, len          // 输入p, q两点及其路径长度

    

    // 初始化c[][]为maxint

    for(int i=1i<=n++i)

        for(int j=1j<=n++j)

            c[i][j] = maxint

    

    for(int i=1i<=line++i) 

    {

        cin >>p >>q >>len

        if(len <c[p][q])       // 有重边

        {

            c[p][q] = len      // p指向q

            c[q][p] = len      // q指向p,这样表示无向图

        }

    }

    

    for(int i=1i<=n++i)

        dist[i] = maxint

    for(int i=1i<=n++i)

    {

        for(int j=1j<=n++j)

            printf("%8d", c[i][j])

        printf("\n")

    }

    

    Dijkstra(n, 1, dist, prev, c)

    

    // 最短路径长度

    cout <<"源点到最后一个顶点的最短路径长度: " <<dist[n] <<endl

    

    // 路径

    cout <<"源点到最后一个顶点的路径为: "

    searchPath(prev, 1, n)

}