图结构练习——最短路径->Dijkstra算法--单源最短路

#include
using namespace std;
const int INF=0x3f3f3f;
int vis[1111],dis[1111],a[111][111],n,m;
void Dij(int s)
{
    memset(dis,INF,sizeof(INF));
    for(int i=1; i<=n; i++)
        dis[i]=a[s][i];
    vis[s]=1;           //将当前位置标记
    //dis[s]=0;         //dis数组在当前点的值已经在上面赋值过了,这里可不加
    for(int i=1; i<=n-1; i++)
    {
        int minn=INF;   //找离源点最近的那条路的权值,并用u记录该点
        int u;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0&&dis[j]>n>>m)
    {
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                    a[i][j]=0;
                else
                    a[i][j]=INF;
            }
        }
        for(int i=1; i<=m; i++)
        {
            int u,v,w;
            cin>>u>>v>>w;
            if(a[u][v]>w)    //题目没有明确要求,真是坑我,这是避免覆盖最短路,因为可能有重边
            {
                a[u][v]=w;
                a[v][u]=w;
            }
        }

        Dij(1);
        cout<

 

你可能感兴趣的:(图结构练习——最短路径->Dijkstra算法--单源最短路)