#include #include #define MAX 20 #define INF 999 int mat[MAX][MAX]; int V; int dist[MAX]; int q[MAX]; int qp = 0; void enqueue(int v) { q[qp++] = v; } int cf(void *a, void *b) { int *x = (int *)a; int *y = (int *)b; return *y - *x; } int dequeue() { qsort(q, qp, sizeof(int), cf); return q[--qp]; } int queue_has_something() { return (qp > 0); } int visited[MAX]; int vp = 0; void dijkstra(int s) { dist[s] = 0; int i; for (i = 0; i < V; ++i) { if (i != s) { dist[i] = INF; } enqueue(i); } while (queue_has_something()) { int u = dequeue(); visited[vp++] = u; for (i = 0; i < V; ++i) { if (mat[u][i]) { if (dist[i] > dist[u] + mat[u][i]) { dist[i] = dist[u] + mat[u][i]; } } } } } int main(int argc, char const *argv[]) { printf("Enter the number of vertices: "); scanf(" %d", &V); printf("Enter the adj matrix: "); int i, j; for (i = 0; i < V; ++i) { for (j = 0; j < V; ++j) { scanf(" %d", &mat[i][j]); } } dijkstra(0); printf("\nNode\tDist\n"); for (i = 0; i < V; ++i) { printf("%d\t%d\n", i, dist[i]); } return 0; }