多源单源最短路的模板

待理解......

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<algorithm>
#include<map>
#define maxn 2005
#define inf 100000
using namespace std;
int n,bian;
int mp[maxn][maxn];
int u,v,cost;
int dis[maxn];
int pre[maxn];
void init()
{
    cin>>n>>bian;
    //memset(mp,inf,sizeof(mp));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    mp[i][j]=inf;
    for(int i=0;i<bian;i++){
        cin>>u>>v;//可以加边的权值 
        cost=1;//**************
        mp[u][v]=cost;
        mp[v][u]=cost;//无向图 
    }
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
}
void dijkstra(int n,int v)
{
    bool vis[maxn];
    for(int i=1;i<=n;i++)
    {
        vis[i]=false;
        dis[i]=mp[v][i];
        if(dis[i]==inf)
        {
            pre[i]=0;
        }
        else pre[i]=v;
    }
    dis[v]=0;
    vis[v]=true;
    for(int i=2;i<=n;i++)
    {
            int u=v;
            int mazz=inf;
            for(int j=1;j<=n;j++){
        if(!vis[j]&&dis[j]<mazz)//换dis最小的顶点继续查找
        {
                u=j;
                mazz=dis[j];
        }
        }
        vis[u]=true;
        for(int k=1;k<=n;k++)//更新顶点上的dis
        {
            if(!vis[k]&&mp[u][k]<inf)
            {
                if(dis[k]>mp[u][k]+dis[u]){
                    dis[k]=mp[u][k]+dis[u];
                    pre[k]=u;
                }
            }
        }

    }
}
int main()
{
    init();//初始化,建图 
    dijkstra(末,始);//
    cout<<dis[末];
    return 0;
}
原文地址:https://www.cnblogs.com/xiechenxi/p/8443304.html