题目描述
求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。
#include< iostream>
using namespace std;
typedef struct
{
int n;
int e;
char data[500];
int edge[500][500];
}Graph;
typedef struct
{
int index;
int cost;
}mincost;
typedef struct
{
int x;
int y;
int weight;
}EDGE;
typedef struct
{
int index;
int flag;
}F;
void create(Graph &G,int n ,int e)
{
int i,j,k,w;
char a,b;
for(i=0;i< n;i++)
cin>>G.data[i];
for(i=0;i< n;i++)
for(j=0;j< n;j++)
{
if(i==j)
G.edge[i][j]=0;
else
G.edge[i][j]=100;
}
for(k=0;k< e;k++)
{
cin>>a;
cin>>b;
cin>>w;
for(i=0;i< n;i++)
if(G.data[i]==a) break;
for(j=0;j< n;j++)
if(G.data[j]==b) break;
G.edge[i][j]=w;
G.edge[j][i]=w;
}
G.n=n;
G.e=e;
}
void Prim(Graph &G,int k)
{
//完成Prim算法
}
int main()
{
Graph my;
int n,e;
cin>>n>>e;
create(my,n,e);
Prim(my,0);
return 0;
}
输入
第一行为图的顶点个数n第二行为图的边的条数e接着e行为依附于一条边的两个顶点和边上的权值
输出
最小生成树中的边。
样例输入
6
10
ABCDEF
A B 6
A C 1
A D 5
B C 5
C D 5
B E 3
E C 6
C F 4
F D 2
E F 6
样例输出
(A,C)(C,F)(F,D)(C,B)(B,E)
参考程序
#include<iostream>
using namespace std;
typedef struct
{
int n;
int e;
char data[50];
int edge[50][50];
}Graph;
typedef struct
{
int index;
int cost;
}mincost;
void create(Graph &G,int n ,int e)
{
int i,j,k,w;
char a,b;
for(i=0;i<n;i++) cin>>G.data[i];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j) G.edge[i][j]=0;
else G.edge[i][j]=100; //最大值
}
for(k=0;k<e;k++)
{
cin>>a;
cin>>b;
cin>>w;
for(i=0;i<n;i++)
if(G.data[i]==a) break;
for(j=0;j<n;j++)
if(G.data[j]==b) break;
G.edge[i][j]=w;
G.edge[j][i]=w; //对称矩阵
}
G.n=n;
G.e=e;
}
void mintree(Graph &G,int k)
{
int i,j,mindata,loc;
mincost lowcost[50];
for(i=0;i<G.n;i++)
{
if(i!=k)
{
lowcost[i].index=k;
lowcost[i].cost=G.edge[k][i];
}
lowcost[k].cost=0;
lowcost[k].index=k;
}
for(i=0;i<G.n-1;i++)
{
mindata=100;
for(j=0;j<G.n;j++)
if(lowcost[j].cost<mindata&&lowcost[j].cost!=0)
{
mindata=lowcost[j].cost;
loc=j;
}
cout<<"("<<G.data[lowcost[loc].index]<<","<<G.data[loc]<<")";
for(j=0;j<G.n;j++)
{
if(G.edge[loc][j]<lowcost[j].cost)
{
lowcost[j].cost=G.edge[loc][j];
lowcost[j].index=loc; //前结点
}
}
}
}
int main()
{
Graph my;
int n,e;
cin>>n>>e;
create(my,n,e);
mintree(my,0);
return 1;
}
注意
该程序仅供学习参考!