Árbol de expansión mínimo C + algoritmo Prim 08-Figura 7 Road Village Village (30 puntos)

08-Figure 7 Highway Village Village Pass (30 puntos)

La tabla de datos estadísticos de las carreteras existentes entre las aldeas enumera los costos de varias carreteras que pueden construirse como carreteras estándar, con el fin de garantizar que cada aldea tenga el costo mínimo requerido para la conectividad vial.

Formato de entrada:
los datos de entrada incluyen un entero positivo N (≤1000) para el número de ciudades y un número M (≤3N) para las carreteras candidatas; las siguientes líneas M corresponden a M carreteras, y cada línea da 3 enteros positivos, que están directamente conectados a la carretera. El número de las dos ciudades y el costo estimado de la reconstrucción del camino. Para simplificar, las ciudades están numeradas del 1 al N.

Formato de
salida : salida del costo más bajo requerido por el pueblo. Si los datos de entrada no son suficientes para garantizar un flujo suave, entonces la salida -1, lo que indica que se deben construir más caminos.

Entrada de muestra:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

Salida de muestra:

12

Resolver un problema
Construir un árbol de expansión mínimo a partir de nodos y bordes dados;
generar la suma de los pesos mínimos de borde de árbol de expansión;
puntos clave : el método de construcción del árbol de expansión mínimo

Algoritmo Prim

Establezca un punto como el primer árbol, este punto dist es 0;
actualice el dist de este punto directamente conectado a la longitud del lado;
ingrese el bucle, atraviese el dist de cada nodo, cuando no sea 0 (lo que indica que no está en el árbol ) Y como mínimo, se incluye en el árbol, y se agrega la longitud de este lado, y se registra el número de nodos de las especies de árboles existentes;
juicio :
cuando el bucle salta, significa que no está en el árbol y está conectado al lado derecho del árbol Si el número de nodos en el árbol es diferente del punto de resumen, significa que el gráfico no está conectado y no hay un árbol de expansión mínimo;
si está conectado, se puede generar la longitud total de la ruta;

1. Función de entrada

#include<iostream>
using namespace std;
#define inf 0x3f3f3f3f
#define MAXNUM 1010
int N,M;
int Graph[MAXNUM][MAXNUM];

void input()
{
	fill(Graph[0],Graph[0]+MAXNUM*MAXNUM,inf); //一定要记得初始化 
	cin>>N>>M;
	for(int i=0;i<M;i++)     //读入15条边 
	{
		int a,b,weight;
		cin>>a>>b>>weight;
		Graph[a][b]=weight;
		Graph[b][a]=weight;
	}
}

Función 2.Prim

int prim()     
{
	int dist[MAXNUM];
	int totalweight=0;
	int Vcount=0;
	//从1出发
	fill(dist,dist+MAXNUM,inf);      //初始化dist
	dist[1]=0;    // 挑一个结点先入,这里选择编号为1的结点
	Vcount++;      
	for(int i=1;i<=N;i++)      //更新第一个结点周围的dist 
		if(dist[1]+Graph[1][i]<dist[i])
			dist[i]=Graph[1][i];

	
	while(1)
	{	int Min=inf;
		int V=-1;
		for(int i=1;i<=N;i++)                  //在dist中找最小值
			if(dist[i]!=0&&dist[i]<Min)
			{
				Min=dist[i];
				V=i;
			}

		
		if(V==-1) break;
		totalweight+=dist[V];  //加上路径长度 
		dist[V]=0;             //将结点加入树内 
		Vcount++;              //记录结点数 
		
		for(int i=1;i<=N;i++)
			if(dist[V]+Graph[V][i]<dist[i])	//只更新结点为0的周围距离 
				dist[i]=Graph[V][i];
	}
	if (Vcount<N) totalweight=-1;
	return totalweight;
}

Función 3.main

int main()
{
	input();
	int result=prim();
	cout<<result;
 }
Publicados 105 artículos originales · ganado elogios 6 · vistas 4950

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105511806
Recomendado
Clasificación