DS图—最小生成树
题目描述
根据输入创建无向网。分别用Prim算法和Kruskal算法构建最小生成树。(假设:输入数据的最小生成树唯一。)
输入
顶点数n
n个顶点
边数m
m条边信息,格式为:顶点1顶点2权值
Prim算法的起点v
输出
输出最小生成树的权值之和
对两种算法,按树的生长顺序,输出边信息(Kruskal中边顶点按数组序号升序输出)
输入输出样例
输入样例
6
v1 v2 v3 v4 v5 v6
10
v1 v2 6
v1 v3 1
v1 v4 5
v2 v3 5
v2 v5 3
v3 v4 5
v3 v5 6
v3 v6 4
v4 v6 2
v5 v6 6
v1
输出样例
15
prim:
v1 v3 1
v3 v6 4
v6 v4 2
v3 v2 5
v2 v5 3
kruskal:
v1 v3 1
v4 v6 2
v2 v5 3
v3 v6 4
v2 v3 5
代码
#include<iostream>
#include<algorithm>
using namespace std;
class Map {
public:
Map() {
cin>>vexnum;
ch = new string[vexnum];
for(int i=0;i<vexnum;i++)
cin>>ch[i];
Matrix = new int*[vexnum];
for(int i=0;i<vexnum;i++)
Matrix[i] = new int[vexnum];
for(int i=0;i<vexnum;i++)
for(int j=0;j<vexnum;j++)
Matrix[i][j] = 10000;
cin>>arcnum;
int pos1,pos2,number;
for(int i=0;i<arcnum;i++)
{
string s1,s2;
cin>>s1>>s2>>number;
for(int j=0;j<vexnum;j++)
{
if(s1==ch[j])
pos1=j;
if(s2==ch[j])
pos2=j;
}
Matrix[pos1][pos2] = number;
Matrix[pos2][pos1] = number;
}
Visit = new bool[vexnum];
}
~Map()
{
for(int i=0;i<vexnum;i++)
delete Matrix[i];
delete []Matrix;
delete []Visit;
}
void Prim(string start);
void Kruskal();
private:
int vexnum;
string *ch;
int **Matrix;
int arcnum;
bool *Visit;
};
void Map::Prim(string start)
{
string *s1 = new string[100];
string *s2 = new string[100];
int *temp = new int[100];
int p1=0,p2=0,p3=0;
int total=0,pos;
for(int i=0;i<vexnum;i++)
{
Visit[i] = false;
if(start==ch[i])
pos=i;
}
Visit[pos] = true;
int *len = new int[vexnum];
int pos1,pos2;
while(1)
{
int min=10000;
for(int j=0;j<vexnum;j++)
{
if(Visit[j])
{
pos=j;
for(int i=0;i<vexnum;i++)
{
if(Matrix[pos][i]<min&&Visit[i] == false&&i!=pos)
{
pos1=i;
pos2=pos;
min=Matrix[pos][i];
}
}
}
}
Visit[pos1] = true;
s1[p1++]=ch[pos2];
s2[p2++]=ch[pos1];
temp[p3++] = min;
//cout<<ch[pos2]<<" "<<ch[pos1]<<" "<<min<<endl;
total +=min;
int z=0;
for(int i=0;i<vexnum;i++)
if(Visit[i]==false)
{
z=1;
break;
}
else
z=0;
if(z==0)
break;
}
cout<<total<<endl;
cout<<"prim:"<<endl;
for(int i=0;i<p1;i++)
{
cout<<s1[i]<<" "<<s2[i]<<" "<<temp[i]<<endl;
}
}
void Map::Kruskal() {
cout<<"kruskal:"<<endl;
int *visit = new int[vexnum];
for(int i=0;i<vexnum;i++)
visit[i] = i;
int FindNum[100];
for(int i=0;i<100;i++)
FindNum[i] = 10000;
int pos1,pos2,pos3=0;
for(int i=0;i<vexnum;i++)
for(int j=0;j<=i;j++)
if(Matrix[i][j]!=10000)
FindNum[pos3++] = Matrix[i][j];
sort(FindNum,FindNum+pos3);
for(int z=0;z<pos3;z++)
{
for(int i=0;i<vexnum;i++)
for(int j=0;j<vexnum;j++)
{
if(Matrix[i][j] ==FindNum[z] && visit[i] != visit[j])
{
for(int p=0;p<vexnum;p++)
if(visit[p] == visit[j]&&p!=i&&p!=j)
visit[p] = visit[i];
visit[j] = visit[i];
cout<<ch[i]<<" "<<ch[j]<<" "<<FindNum[z]<<endl;
}
}
}
}
int main()
{
Map map;
string start;
cin>>start;
map.Prim(start);
map.Kruskal();
return 0;
}