最小生成树
Prim算法

int AMGraph::sum(string v)
{int start, totalW, cnt, minW, u, vv, i, j;start = LocateVex(v); memset(visited, false, sizeof(visited)); visited[start] = true;totalW = 0; cnt = 1; while (cnt < vexnum){minW = INT_MAX; u = -1; vv = -1;for (i = 0; i < vexnum; i++){if (visited[i]){for (j = 0; j < vexnum; j++){if (!visited[j] && arcs[i][j] < minW){minW = arcs[i][j];u = i; vv = j; }}}}if (vv == -1){break;}visited[vv] = true; totalW += minW; cnt++; }return totalW;
}
Kruskal算法

void AMGraph::kruskal()
{int i, j;for (i = 0; i < arcnum; i++) {for (j = i + 1; j < arcnum; j++){if ((edges[i].w > edges[j].w) || (edges[i].w == edges[j].w && edges[i].u > edges[j].u)){Edge temp = edges[i];edges[i] = edges[j];edges[j] = temp;}}}for (i = 0; i < vexnum; i++) {Vexset[i] = i;}for (i = 0; i < arcnum; i++) {int v1 = edges[i].u; int v2 = edges[i].v; int vs1 = Vexset[v1]; int vs2 = Vexset[v2];if (vs1 != vs2){if (edges[i].u < edges[i].v){cout << vexs[edges[i].u] << " " << vexs[edges[i].v] << " " << edges[i].w << endl;}else{cout << vexs[edges[i].v] << " " << vexs[edges[i].u] << " " << edges[i].w << endl;}for (j = 0; j < arcnum; j++){if (Vexset[j] == vs2){Vexset[j] = vs1;}}}}
}
两种算法比较
