求最小生成树(Prim算法)(1075)

时间:2023-03-09 19:07:09
求最小生成树(Prim算法)(1075)

Description

求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。

Input

第一行为图的顶点个数n
     第二行为图的边的条数e

     接着e行为依附于一条边的两个顶点和边上的权值

Output

最小生成树中的边。

Sample Input

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
Sample Output
(A,C)(C,F)(F,D)(C,B)(B,E)
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std; typedef struct
{
int n;
int e;
char data[];
int edge[][];
}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 = ; i< n; i++)
cin >> G.data[i];
for (i = ; i< n; i++)
for (j = ; j< n; j++)
{
if (i == j)
G.edge[i][j] = ;
else
G.edge[i][j] = ;
} for (k = ; k< e; k++)
{
cin >> a;
cin >> b;
cin >> w;
for (i = ; i< n; i++)
if (G.data[i] == a) break;
for (j = ; 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;
}
#define inf 32767
void Prim(Graph &G, int v)
{
int lowcost[];
int min, closest[], i, j, k;
for (i = ; i < G.n; i++)
{
lowcost[i] = G.edge[v][i];
closest[i] = v;
}
for (i = ; i < G.n; i++)
{
min = inf;
for (j = ; j < G.n; j++)
{
if (lowcost[j] && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
}
cout << '(' << G.data[closest[k]] << ',' << G.data[k] << ')';
lowcost[k] = ;
for (j = ; j < G.n; j++)
if (G.edge[k][j] && G.edge[k][j] < lowcost[j])
{
lowcost[j] = G.edge[k][j];
closest[j] = k;
}
}
} int main()
{
Graph my;
int n, e;
cin >> n >> e;
create(my, n, e);
Prim(my, );
return ;
}