최소 스패닝 트리 욕심 알고리즘을 해결

첫째, 실험적인 요구 사항의 목적

  1. 욕심 기본 원칙의 알고리즘과 응용 프로그램의 범위와 친숙한.
  2. 최소 스패닝 트리 문제를 해결, 탐욕 알고리즘 프로그래밍을 사용합니다.

둘째, 실험 내용

선택적으로 하나의 욕심 알고리즘 (프림 또는 크루스 칼), 최소 스패닝 트리를 해결. 알고리즘에 대한 설명과 분석의 복잡성.

프로그래밍과 테스트 예제를 제공합니다

셋째, 이데올로기 달성하기 위해

프림 : S 개의 세트로 V 초기 S {1} V 모든 정점을 포함하고 VS의 J의 정점 S에서 가장 가까운 정점 거리를 선택하고, J는 S.에 추가되면 두 배열에 가장 가까운과 lowcost 설정. 각 J가 속하는 들어 VS, 벽장 [J]를 S K 다른 이웃이 비교되는 S의 점 J, 인접 V [J] [벽장 [J ] <= V [J] [K] 상기 lowcost [J]를 V [J] [가까운]의 값이다 . 가 마지막으로 최소 스패닝 트리의 해당 무게 값이 저장 lowcost, 각 정점, 가장 가까운 최소 스패닝 트리가 해당 가장자리에서 찾을 수 있습니다.

넷째, 구현 코드

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define mmax 100
#define maxt 100000000
int v[mmax][mmax];

void Prim(int n){
	int low[mmax];// 
	int clo[mmax];
	bool s[mmax];//判断该节点是否在S中 
	s[1]=true;
	for(int i=2;i<=n;i++){
		low[i]=v[1][i];//初始化 
		clo[i]=1;
		s[i]=false;
	}
	for(int i=1;i<n;i++){//对剩余的n-1个顶点进行操作 ,此处的i并无实际意思,只是起到一个记录变量的作用 
		int min=maxt;
		int j=1;
		for(int k=2;k<=n;k++)//从V-S中找到S中边权最小的节点 
			if((low[k]<min)&&(!s[k])){
				min=low[k];
				j=k;
			}
			cout<<j<<" "<<clo[j]<<":"<<low[j]<<endl;
			s[j]=true;
			for(int k=2;k<=n;k++){//调整low中的值,加入j节点之后,使得两个集合中的距离最小 
				if((v[j][k]<low[k])&&(!s[k])){
					low[k]=v[j][k];
					clo[k]=j;
				}
			}
		
	}
} 

int main()
{
	int n,m;//n vertexs and m edges
	cin>>n>>m;
	int ii,jj,tt;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++)
		v[i][j]=maxt;
	}
	for(int i=0;i<m;i++){
		cin>>ii>>jj>>tt;
		v[ii][jj]=tt;
		v[jj][ii]=tt;
	}
	Prim(n);
	return 0;
}

//6 10
//1 2 6
//1 4 5
//1 3 1
//2 3 5
//2 5 3
//3 4 5
//3 5 6
//3 6 4
//4 6 2
//5 6 6

게시 43 개 원래 기사 · 원의 찬양 (23) · 전망 5306

추천

출처blog.csdn.net/weixin_43442778/article/details/89604050