求最小生成树 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<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
using namespace std;
int m[105][105];
int vis[105];//标记某点是否已访问
int dis[105];//记录每2个点间最小权值
int path[105];//记录最短路线 
int n;
string s;
void prim() {
	int i,j,k,tmp;
	for(i=0;i<n;i++)
		dis[i]=inf;//初始化
	dis[0]=0;
	for(i=0;i<n;i++) 
	{
		tmp=inf;
		for(j=0;j<n;j++) 
		{
			if(!vis[j]&&tmp>dis[j]) 
			{
				tmp=dis[j];
				k=j;
			}//找出最小距离的节点
		}
		if(i)
			cout<<'('<<s[path[k]]<<','<<s[k]<<')';
		vis[k]=1;//把访问的节点做标记
		int min=inf;
		for(j=0;j<n;j++) 
		{
			if(!vis[j]&&dis[j]>m[k][j]) 
			{
				dis[j]=m[k][j];
				//更新最短距离
				path[j]=k;
			}
		}
	}
}
int main() {
	int e;
	cin>>n>>e>>s;
	mem(m,0x3f);
	while(e--) 
	{
		char x,y;
		int t;
		cin>>x>>y>>t;
		m[x-'A'][y-'A']=m[y-'A'][x-'A']=t;
	}
	prim();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值