Graph theory_dijkstra template_single source shortest path algorithm

// dijkstra 单源最短路径算法
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f3f;
const int N=111;

// vv 二维矩阵图    start 起始顶点
vector<int> dijkstra( vector< vector<int> >& vv,int start )
{
    int i,j,min_dis,tpos;
    int n=vv.size();            // 图的顶点个数
    vector<bool> used( n,0 );   // 标记已作为中间结点完成访问的顶点
    vector<int> dis( n,0 );     // 存储 start 到其他顶点的最短路径

    for( i=0;i<n;i++ ) 
		dis[i]=vv[start][i];     // 初始化起始点到其他顶点的距离

    used[start]=1;              // 标记起始顶点 表示已完成访问

    for( i=0;i<n;i++ )
    {
        min_dis=INF;
        tpos=0;                 // 当前未完成访问的结点中最短距离点的编号

        for( j=0;j<n;j++ )      // 寻找 tpos
            if( used[j]==0 && min_dis > dis[j] )
            {
                min_dis=dis[j];
                tpos=j;
            }
        for( j=0;j<n;j++ )              // min_dis
            if( used[j]==0 && dis[j] > dis[tpos] + vv[tpos][j] )
                dis[j]=dis[tpos]+vv[tpos][j];
        used[tpos]=1;
    }
    return dis;
}

int main()
{
    vector< vector<int> > vv;
    int n,i,j;

    while( cin>>n )
    {
    	vv.clear();
    	
        for( i=0;i<n;i++ )
        {
            vv.push_back( vector<int>() );
            for( j=0;j<n;j++ )
                vv[i].push_back(INF);
            vv[i][i]=0;
        }
        // ... // 存图
        vector<int> dis=dijkstra( vv,0 );
        // ...
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/qq_63173957/article/details/123920657