#include<stdio.h> // printf() #include<stdlib.h> // malloc(), free() #include<limits.h> // INT_MAX for noEdgeValue typedef int ElemType; typedef int BOOL; #define TRUE 0 #define FALSE -1 //////////////////////////////////////////////////////////////////////////////// // P.34 // Program 3.2 Queue typedef struct { int front; int rear; int maxSize; ElemType* element; }Queue; void Create(Queue* Q, int mSize) { Q->maxSize = mSize; Q->element = (ElemType*)malloc(sizeof(ElemType) * mSize); Q->front = Q->rear = 0; } // Function name conflicted with Destroy() of mGraph, so I changed its name... void Destroy_Queue(Queue* Q) { Q->maxSize = -1; free(Q->element); Q->front = Q->rear = -1; } BOOL IsEmpty(Queue* Q) { return Q->front == Q->rear; } BOOL IsFull(Queue* Q) { return (Q->rear + 1) % Q->maxSize == Q->front; } BOOL Front(Queue * Q, ElemType * x) { if (IsEmpty(Q)) return FALSE; *x = Q->element[(Q->front + 1) % Q->maxSize]; return TRUE; } BOOL EnQueue(Queue * Q, ElemType x) { if (IsFull(Q)) return FALSE; Q->rear = (Q->rear + 1) % Q->maxSize; Q->element[Q->rear] = x; return TRUE; } BOOL DeQueue(Queue * Q) { if (IsEmpty(Q)) return FALSE; Q->front = (Q->front + 1) % Q->maxSize; return TRUE; } void Clear(Queue * Q) { Q->front = Q->rear = 0; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // MGraph // P.139 - 141 // P.139 typedef int ElemType; typedef struct { ElemType** a; int n; int e; ElemType noEdge; }mGraph; // P.139 Program 9.1 #define ERROR 0 #define OK 1 #define Overflow 2 #define Underflow 3 #define NotPresent 4 #define Duplicate 5 typedef int Status; Status Init(mGraph * mg, int nSize, ElemType noEdgeValue) { int i, j; mg->n = nSize; mg->e = 0; mg->noEdge = noEdgeValue; mg->a = (ElemType * *)malloc(nSize * sizeof(ElemType*)); if (!mg->a) return ERROR; for (i = 0; i < mg->n; i++) { mg->a[i] = (ElemType*)malloc(nSize * sizeof(ElemType)); for (j = 0; j < mg->n; j++) mg->a[i][j] = mg->noEdge; mg->a[i][i] = 0; } return OK; } // P.140 Program 9.2 void Destroy(mGraph * mg) { int i; for (i = 0; i < mg->n; i++) free(mg->a[i]); free(mg->a); } // P.140 Program 9.3 Status Exist(mGraph * mg, int u, int v) { if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v || mg->a[u][v] == mg->noEdge) return ERROR; return OK; } // P.140 Program 9.4 Status Insert(mGraph * mg, int u, int v, ElemType w) { if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v) return ERROR; if (mg->a[u][v] != mg->noEdge) return Duplicate; mg->a[u][v] = w; mg->e++; return OK; } // P.140 Program 9.5 Status Remove(mGraph * mg, int u, int v) { if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v) return ERROR; if (mg->a[u][v] == mg->noEdge) return NotPresent; mg->a[u][v] = mg->noEdge; mg->e--; return OK; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // DFS // There are not any DFS programs based on MGraph in the textbook, // so I made it... void DFS(int v, int visited[], mGraph g) { int i; printf("%d ", v); visited[v] = 1; for (i = 0; i < g.n; i++) { if (g.a[v][i] != 0 && g.a[v][i] != g.noEdge && !visited[i]) { DFS(i, visited, g); } } } void DFSGraph(mGraph g) { int i; // Init visited int* visited = malloc(g.n * sizeof(int)); for (i = 0; i < g.n; i++) visited[i] = 0; // Do DFS for (i = 0; i < g.n; i++) { if (!visited[i]) { DFS(i, visited, g); } } free(visited); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // BFS // There are not any BFS programs based on MGraph in the textbook, // so I made it... void BFS(int v, int visited[], mGraph g) { int i; Queue q; Create(&q, g.n); visited[v] = 1; printf("%d ", v); EnQueue(&q, v); while (!IsEmpty(&q)) { Front(&q, &v); DeQueue(&q); for (i = 0; i < g.n; i++) { if (g.a[v][i] != 0 && g.a[v][i] != g.noEdge && !visited[i]) { visited[i] = 1; printf("%d ", i); EnQueue(&q, i); } } } } void BFSGraph(mGraph g) { int i; // Init visited int* visited = malloc(g.n * sizeof(int)); for (i = 0; i < g.n; i++) visited[i] = 0; // Do BFS for (i = 0; i < g.n; i++) { if (!visited[i]) { BFS(i, visited, g); } } free(visited); } //n is the number of edges void Dijkstra(mGraph g,int n, int start) { int* d = calloc(n, sizeof(int)); //storage the distance int* s = calloc(n, sizeof(int)); //record which node has been confirmed int minrange =999 ; for (int y = 0; y < n; y++) { d[y] = g.a[start][y]; //initlize the array'd', storage the inital range } s[start] = 1; //Initilize completed for (int y = start; y<n||(y%n < start); y++) { int temp = -1; minrange = 999; for (int u = start; u<n||(u%n < start); u++) //find the minium and mark { if (s[u%n] == 0 && d[u%n] < minrange) { minrange = d[u%n]; temp = u%n; } } if (temp == -1) break; s[temp] = 1; //mark the minium range for (int u = start; u < n || (u % n < start) ; u++) { if (g.a[temp][u%n] + d[temp] < d[u%n] ) //current range plus transfer cost still less than origin distance... d[u%n] = g.a[temp][u%n] + d[temp]; //update the range } } for (int y = 0; y < n; y++) { if (y == start) { ; } else { if (d[y] > 999) printf("-1\n"); else printf("%d\n", d[y]); } } free(d); free(s); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int main() { mGraph GBA; int nSize = 0, edge = 0; int start = 0; int u = 0, v = 0; scanf("%d %d %d", &nSize, &edge, &start); Init(&GBA, nSize, 65536); for (int a = 0; a < edge; a++) { scanf("%d %d", &u, &v); Insert(&GBA, u, v, 1); } Dijkstra(GBA, nSize, start); //这里需要寻找最短路径 Destroy(&GBA); return 0; }
《NOJ1049 飞机最少换乘次数问题》有1个想法