理解加记忆,终于自己写出来啦! 还有点小错误,郁闷。。。 这边要注意!在函数里面使用memset来初始化数组。 不能对传进来的pre[]直接sizeof 因为pre为指针,sizeof的值永远为4! #define INFINITE 999999999 #define NUMOFPOINT 301 //Way下标全部从1开始 void Dijkstra(int Graph[][NUMOFPOINT],int s, int dist[], int pre[], int n) { int i; int min; list<int> Set; list<int>::iterator it_next,it; memset(pre, 0, sizeof(pre)); for (i=1;i<=n;i++) { dist[i] = Graph[s][i]; if (dist[i] != INFINITE) { pre[i] = s; Set.push_front(i); } else { //没有else处理,错误了?? pre[i] = 0; } } dist[s] = 0; pre[s] = s; while (!Set.empty()) { it_next = it = Set.begin(); min = *it; it_next++; while (it_next!=Set.end()) { //这边又写错了。。。 if (dist[min]>dist[*it_next]) { min = *it_next; it = it_next; } it_next++; } Set.erase(it); for (i=1;i<=n;i++) { if (Graph[min][i]!=INFINITE&& (pre[i] == 0||dist[i]>Graph[min][i]+dist[min])) { dist[i] = Graph[min][i]+dist[min]; //这边忘记push了... if (pre[i]==0) Set.push_front(i); pre[i] = min; } } } }