//返回与起始点相连的路径最小边 intMinArcNode(ALGraph &G, int &begin, bool *visited) { LinArcNode p = G.vertices[begin].firstarc; int result = 0; if (p != NULL) { while (visited[p->adjvex]) //开始如果是一个已被访问点,找到其他未被访问点,前提已经假设一定会找到 { p = p->nextarc; } LinArcNode min = p;
while (p) { if (min->info > p->info && !visited[p->adjvex]) //较小且被访问 { min = p; } p = p->nextarc; } begin = min->adjvex; result = min->info; } return result; }
//贪心算法 intTSPGreedy(ALGraph &G, int begin, bool *visited) {
int ALLvalue = 0; //总代价 int B = begin; //记录出发点 for (int i = 1; i <= G.vexnum; i++) { visited[begin] = true; //开始点被访问 cout << G.vertices[begin].data << " -> "; //输出开始点 if (i == G.vexnum) //判断当前节点是否为最后一个节点 ,此处已假设必可以找到一点 ,即没有进入死胡同的情况 { LinArcNode p = G.vertices[B].firstarc; //记录出发点的边链表头指针 while (begin != p->adjvex) //判断有没有一条边 和我现在的开始点相连 { p = p->nextarc; } ALLvalue = ALLvalue + p->info; //找到之后就将路程加上去 } else { ALLvalue = ALLvalue + MinArcNode(G, begin, visited); //返回前链表的没有被访问的最小边 } } cout << G.vertices[B].data << endl; return ALLvalue; }