求最小生成树(Prim算法)
1000(ms)
10000(kb)
1726 / 3439
求出给定无向带权图的最小生成树。图的定点为字符型,权值为不超过100的整形。在提示中已经给出了部分代码,你只需要完善Prim算法即可。
输入
第一行为图的顶点个数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>
#include<string.h>
#define inf 9999
using namespace std;
int map[105][105],vis[105],dis[105];
int path[105],n;
char str[1005];
void prim()
{
int i,j,k,tmp,t=0;
memset(vis,0,sizeof(vis));
memset(path,0,sizeof(path));
for(i=0; i<n; i++)
dis[i]=inf;//初始化
dis[0]=0;
for(i=1; i<=n; i++)
{
tmp=inf;
for(j=0; j<n; j++)
{
if(!vis[j]&&tmp>dis[j])
{
tmp=dis[j];
k=j;
}//找出最小距离的节点
}
if(t)
cout<<'('<<str[path[k]]<<','<<str[k]<<')';
t=1;
vis[k]=1;//把访问的节点做标记
int min=9999;
int h;
for(j=0; j<n; j++)
{
if(!vis[j]&&dis[j]>map[k][j])
{
dis[j]=map[k][j];
//更新最短距离
path[j]=k;
}
}
}
}
int main()
{
int e;
cin >> n >> e >> str;
memset(map, 100, sizeof(map));
for (int i = 0; i < e; i++)
{
char x, y;
int t;
cin >> x >> y >> t;
map[x - 'A'][y - 'A'] = map[y - 'A'][x - 'A'] = t;
}
prim();
return 0;