Hangdian 2544 (camino más corto)

1. Para las preguntas de la plantilla del algoritmo de Dijkstra, aplique la plantilla directamente.
2. Considere el caso de aristas repetidas.
3. La inicialización de la matriz map_ es incorrecta, lo que conduce a un tiempo de espera.

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 110
#define INF 0x3f3f3f3
int map_[MAX][MAX];
int dis[MAX];
int vis[MAX];
int n,m;
int dijkstra()
{
    
    
    int min_,v;
    for(int i=1;i<=n;i++)
    {
    
    
        dis[i]=map_[1][i];
        //printf("dis[%d]=%d\n",i,dis[i]);
        vis[i]=0;
    }
    for(int i=1;i<n;i++)
    {
    
    
        min_=INF;
        for(int j=1;j<=n;j++)
        {
    
    
            if(!vis[j]&&dis[j]<min_)
            {
    
    
               min_=dis[j];
               v=j;
            }
        }
        vis[v]=1;
        for(int j=1;j<=n;j++)
        {
    
    
            if(!vis[j]&&dis[j]>dis[v]+map_[v][j])
            {
    
    
                dis[j]=dis[v]+map_[v][j];
            }
        }
    }
    return dis[n];
}
int main()
{
    
    
    int a,b,c;
    while(scanf("%d%d",&n,&m)==2)
    {
    
    
        if(n==0&&m==0)
        {
    
    
            return 0;
        }
        for(int i=1;i<=n;i++)
        {
    
    
            for(int j=1;j<=n;j++)
            {
    
    
                if(i==j)
                {
    
    
                    map_[i][j]=0;
                }
                else
                {
    
    
                    map_[i][j]=INF;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
    
    
            scanf("%d%d%d",&a,&b,&c);
            if(map_[a][b]>c)
            {
    
    
                map_[a][b]=map_[b][a]=c;
            }
        }
        printf("%d\n",dijkstra());
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/mingjiweixiao/article/details/113564342
Recomendado
Clasificación