#include "stdafx.h"
#include <iostream>
using namespace std;
#define MVnum 100
bool visited[100];
class Prim {
private:
char adgvex;
int lowcost;
public:
void setAdgvex(char adgvex) {
this->adgvex = adgvex;
}
void setLowcost(int lowcost) {
this->lowcost = lowcost;
}
char getAdgvex() {
return this->adgvex;
}
int getLowcost() {
return this->lowcost;
}
};
class Graph
{
public:
Graph(int vexnum, int arcnum) {
this->arcnum = arcnum;
this->vexnum = vexnum;
cout << "请依次输入顶点信息" << endl;
for (int i = 0; i < this->vexnum; i++) {
cin >> vexs[i];
}
closedge = new Prim[100];
}
void Creat();
int Location(char v);
void DFS_AM(int v);
void MiniSpanTree(int k) {
char u0,v0;
for (int i = 0; i < this->vexnum; i++) {
if (i != k){
closedge[i].setAdgvex(vexs[k]);
closedge[i].setLowcost(arcs[k][i]);
}
}
closedge[k].setLowcost(0);
for (int i = 1; i < this->vexnum; i++) {
k = Min(closedge);
cout << k << endl;
u0 = closedge[k].getAdgvex();
v0 = this->vexs[k];
cout << u0 << "——>" << v0 << endl;
closedge[k].setLowcost(0);
for (int j = 0; j < this->vexnum; j++) {
if (this->arcs[k][j] < closedge[j].getLowcost()) {
closedge[j].setAdgvex(vexs[k]);
closedge[j].setLowcost(this->arcs[k][j]);
}
}
}
}
int Min(Prim* cl) {
int min = INT_MAX;
int index = -1;
for (int i = 0; i < this->vexnum; i++)
{
if (closedge[i].getLowcost() < min &&
closedge[i].getLowcost() != 0)
{
min = closedge[i].getLowcost();
index = i;
}
}
return index;
}
void printGraph();
private:
char vexs[MVnum];
int arcs[MVnum][MVnum];
int vexnum;
int arcnum;
Prim *closedge;
};
void Graph::Creat()
{
int weight;
char v1, v2;
for (int i = 0; i < this->vexnum; i++) {
for (int j = 0; j < this->vexnum; j++) {
arcs[i][j] = INT_MAX;
}
}
for (int k = 0; k < this->arcnum; k++) {
cout << "请输入两个顶点值及其权值" << endl;
cin >> v1 >> v2 >> weight;
int i = Location(v1);
int j = Location(v2);
arcs[i][j] = weight;
arcs[j][i] = weight;
}
}
int Graph::Location(char v)
{
for (int i = 0; i < this->vexnum; i++) {
if (vexs[i] == v)
{
return i;
}
}
}
void Graph::DFS_AM(int v = 0)
{
cout << vexs[v] << endl;
visited[v] = true;
for (int w = 0; w < vexnum; w++)
{
if ((arcs[v][w] != INT_MAX) && (!visited[w]))
{
DFS_AM(w);
}
}
}
void Graph::printGraph() {
int temp;
for (int i = 0; i < this->vexnum; i++) {
for(int j = 0;j < this->vexnum;j++){
if (this->arcs[i][j] == INT_MAX) {
temp = 0;
}
else {
temp = this->arcs[i][j];
}
cout<<temp<< "\t";
}
cout << endl;
}
}
int main()
{
Graph z(6, 10);
z.Creat();
z.DFS_AM();
z.printGraph();
z.MiniSpanTree(0);
system("pause");
return 0;
}