《数据结构与算法分析——C语言描述》 第九章
struct TableEntry {
int known;
double dist;
int isInQueue;//是否在队列中
int popCnt;//出队次数,应该不存在负圈,少于V+1
Vertex path;
};
typedef struct TableEntry* Table;//数组
Table initTable(Vertex start, Graph g) {
Table t;
t = (Table)malloc(sizeof(struct TableEntry)*vexNum);
int i;
for (i = 0; i < vexNum; i++) {
t[i].dist = DBL_MAX;//double的最大值
t[i].known = 0;
t[i].path = NOTAVERTEX;
t[i].isInQueue = 0;
t[i].popCnt = 0;
}
t[start].dist = 0;
t[start].isInQueue = 1;
return t;
}
void printPath(Vertex v, Table t) {
if (t[v].popCnt <= vexNum) {
if (t[v].known == 1) {
if (t[v].path != NOTAVERTEX) {//
printPath(t[v].path, t);
printf("to ");
}
printf("%s ", nameRecord[v]);
}
else
printf("can not arrive");
}
}
void weightedNegativ(Table t, Vertex startVex, Graph g) {
Vertex v, w;
std::queue<int> q;
q.push(startVex);
while (!q.empty()) {
v = q.front();
q.pop();
t[v].isInQueue = 0;
t[v].known = 1;
t[v].popCnt++;
if (t[v].popCnt > vexNum)
break;
EdgeNodePtr p = getEdgeNodePtr(v, g);
while (p) {
w = getVex(p);
if (t[v].dist + getWeight(p) < t[w].dist) {
t[w].dist = t[v].dist + getWeight(p);
t[w].path = v;
}
if (t[w].isInQueue == 0) {
q.push(w);
t[w].isInQueue = 1;
}
p = advance(p);
}
}
for (int i = 0; i < vexNum; i++) {
printPath(i, t);
printf("\n");
//printf("%d %lf %d %d\n", t[i].known, t[i].dist, t[i].path, t[i].isInQueue);
}
}
int main() {
freopen("filein.txt", "r", stdin);
Graph g = readGraph();
Vertex startVex = 0;
Table t = initTable(startVex, g);
weightedNegativ(t, startVex, g);
}