HDU2544 más corto (punto de partida único para un solo extremo método Dykstra)

Descripción del problema
en el concurso escolar anual, todos los finalistas Los estudiantes recibirán una camiseta agradable. Pero cada vez que nuestro personal de cientos de piezas de ropa enviado de vuelta al estadio de la tienda cuando están muy cansados! Así que ahora quieren encontrar la ruta más corta al estadio de la tienda, puede ayudar a ellos?

De entrada
de entrada incluye una pluralidad de conjuntos de datos. La primera línea de cada dos enteros N, M (N <= 100 , M <= 10000), N representa unos intersecciones de calles Chengdu, el número de referencia 1 es para almacenar la ubicación de la intersección, la intersección designada N es la ubicación del estadio, M indica un par de opciones en Chengdu. N = M = 0 indica el final de la entrada. Siguiente M filas, cada fila comprende tres enteros A, B, C (1 < = A, B <= N, 1 <= C <= 1000), indica que hay un camino entre la intersección A y la intersección B, nos el personal necesita tiempo C minutos viajó este camino.
línea de entrada para asegurar la presencia de al menos una pista de almacenar.

Salida
Para cada línea de entrada y salida, representa a los trabajadores de la pista vienen desde el momento tienda mínimo

Ejemplo de entrada
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Salida de muestra
3
2

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//这道题倒像是迪杰特斯拉的套用模板就行
int n,m;//N是路口数,M表示有M条路
int a,b,c;//从a到b,需要c时间
int maptime[100][100];//存储时间
int dis[1000];//在DJ里存储时间,也就是距离,后面写了我就懒得后面了
bool mark[100];
int i,j,k;
void Dj(int s){
    //前期工作,该点作为起始点,
    //对距离进行赋值
    for(i=1;i<=n;i++){
        mark[i]=false;
        dis[i]=maptime[s][i];
    }
    dis[i]=0;
    mark[s]=true;
    //然后就开始一次判断找到最小的距离和更新操作了
    for(i=1;i<n;i++){//只是代表进行n-1次
            int mmin=1000;
        for(j=1;j<=n;j++){
            if(!mark[j]&&dis[j]<mmin){
                mmin=dis[j];
                k=j;
            }
        }
        //经过一次循环之后,找到最小的那个
        mark[k]=true;
        //开始更新
        for(j=1;j<=n;j++){
            if(!mark[j]&&(dis[j]>(dis[k]+maptime[k][j])))
                dis[j]=(dis[k]+maptime[k][j]);
        }
    }
}
int main(){
    //输入入口和路
    while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0){
    //初始化maptime
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        maptime[i][j]=100;
    //开始输入边
    for(i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        maptime[a][b]=c;
        maptime[b][a]=c;
    }
    //起点是商店
    Dj(1);
    printf("%d \n",dis[n]);

}
}
Publicado 72 artículos originales · ganado elogios 5 · Vistas 2799

Supongo que te gusta

Origin blog.csdn.net/qq_41115379/article/details/104990751
Recomendado
Clasificación