Задача по алгоритму дейсктера(СИ)

Застрял на решении задания по си:

Имеется N населенных пунктов , пронумерованных от 1 до N. Некоторые пары пунктов соединены дорогами. вывести самый короткий путь из L-го пункта в M-й. Информация о дорогах задается в виде последовательности пар чисел i и j (i < j), указывающих, что i-й и j-й пункты соединены дорогой, признак конца этой последовательности - пара нулей.

Подскажете, в каком моменте я начал ошибаться?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

#define MAX 100

int n;
int adj[MAX][MAX];
int d[MAX];
int used[MAX];

void dijkstra(int s)
{
    for (int i = 1; i <= n; i++)
    {
        d[i] = -1;
        used[i] = 0;
    }

    d[s] = 0;

    while (1)
    {
        int v = -1;

        for (int i = 1; i <= n; i++)
        {
            if (!used[i] && d[i] != -1)
            {
                if (v == -1 || d[v] > d[i])
                {
                    v = i;
                }
            }
        }

        if (v == -1)
        {
            break;
        }

        used[v] = 1;

        for (int i = 1; i <= n; i++)
        {
            if (adj[v][i] != -1 && (d[i] == -1 || d[i] > d[v] + adj[v][i]))
            {
                d[i] = d[v] + adj[v][i];
            }
        }
    }
}

int main()
{
    setlocale(LC_ALL, "Rus");
    int l, m;

    printf("Введите количество населенных пунктов: ");
    scanf_s("%d", &n);

    printf("Введите информацию о дорогах:\n");

    while (1)
    {
        int i, j;

        scanf_s("%d %d", &i, &j);

        if (i == 0 && j == 0)
        {
            break;
        }
        adj[i][j] = adj[j][i] = 1;
        
    }

    printf("Введите номер начального пункта: ");
    scanf_s("%d", &l);

    printf("Введите номер конечного пункта: ");
    scanf_s("%d", &m);

    dijkstra(l);

    printf("Самый короткий путь из пункта %d в пункт %d равен %d\n", l, m, d[m]);

    return 0;
}

Ответы (0 шт):