PIPIOJ 1004: Proyecto Huimin

Enlace de tema:
Portal

Descripción del título:
El objetivo del "Proyecto Beneficio de la Gente" del Gobierno Municipal es instalar gasoductos entre n zonas residenciales de la ciudad (pero no necesariamente conectadas directamente por gasoductos, siempre que se pueda llegar a ellas indirectamente a través de gasoductos). Obviamente, se pueden construir como máximo n (n-1) / 2 tuberías, pero de hecho, solo es necesario construir n-1 tuberías para conectar n áreas residenciales. Ahora por favor escriba un programa para calcular el costo mínimo del proyecto beneficiario.

Entrada: la
entrada de prueba contiene varios casos de prueba. La primera línea de cada caso de prueba da el número de sitios residenciales M (<= 100) y el número de tuberías evaluadas N; las siguientes N líneas corresponden al costo de las tuberías entre los sitios residenciales, y cada línea da un par de números enteros positivos , respectivamente El número de los dos asentamientos y el costo del oleoducto entre los dos asentamientos (también un número entero positivo). Por simplicidad, los asentamientos están numerados del 1 al M.

Salida:
Para cada caso de prueba, genere el costo más bajo requerido para el flujo fluido de las tuberías de la ciudad en una línea. Si los datos estadísticos no son suficientes para garantizar un flujo uniforme, envíe "?".

Entrada de muestra:
3 3
1 2 1
1 3 2
2 3 4
3 1
2 3 2

Salida de muestra:
3
?

código de referencia del algoritmo prim c:

#include <stdio.h>
#include <string.h>

#define INF 0x3f3f3f3f
#define MAX 101

int m,n;
int cost[MAX][MAX];
int dist[MAX];
int visited[MAX];

void prim()
{
    
    
    memset(visited,0,sizeof(visited));
	int i,j,sum=0;
	for(i=1;i<=m;i++)
	 dist[i]=cost[1][i];
	
	visited[1]=1;
	
	for(i=1;i<m;i++)
	{
    
    
		int min=INF,pos=-1;
		for(j=1;j<=m;j++)
		{
    
    
			if(visited[j]==0&&dist[j]<min)
			{
    
    
				min=dist[j];
				pos=j;
			}
		}
		
		if(pos!=-1)
		{
    
    
		 visited[pos]=1;
		 sum+=min;
		}
		else
		 break;
		
		for(j=1;j<=m;j++)
		{
    
    
			if(visited[j]==0&&dist[j]>cost[pos][j])
			 dist[j]=cost[pos][j];
		}
	}
	
	for(i=1;i<=m;i++)
	{
    
    
		if(visited[i]==0)
		 break;
	}
	
	if(i==m+1)
	 printf("%d\n",sum);
	else
	 printf("?\n");
}

int main()
{
    
    
	int i,x,y,z;
	
	while(scanf("%d%d",&m,&n)!=EOF)
	{
    
    
		memset(cost,INF,sizeof(cost));
		for(i=1;i<=m;i++)
		 cost[i][i]=0;
		
		for(i=0;i<n;i++)
		{
    
    
			scanf("%d%d%d",&x,&y,&z);
			cost[x][y]=cost[y][x]=z;
		}
		
		prim();
	}
	return 0;
}

Código de referencia del algoritmo c de Kruskal:

#include <stdio.h>
#include <stdlib.h>

#define MAX 101

int n,m;
int parent[MAX];

typedef struct{
    
    
	int u,v;
	int w;
}Tube,*tube;

Tube a[4951];

int cmp(const void *a,const void *b)
{
    
    
	tube pa=(tube)a;
	tube pb=(tube)b;
	int num1=pa->w;
	int num2=pb->w;
	return num1-num2;
}

void init()
{
    
    
	int i;
	for(i=1;i<=m;i++)
	 parent[i]=i;
}

int find(int x)
{
    
    
	if(x==parent[x])
	 return x;
	else
	 return parent[x]=find(parent[x]);
}

void kruskal()
{
    
    
	qsort(a,n,sizeof(Tube),cmp);
	
	int i,sum=0,count=0;
	for(i=0;i<n;i++)
	{
    
    
		int A=find(a[i].u);
		int B=find(a[i].v);
		if(A!=B)
		{
    
    
			parent[A]=B;
			sum+=a[i].w;
		}
	}
	
	for(i=1;i<=m;i++)
	{
    
    
		if(parent[i]==i)
		 count++;
	}
	
	if(count==1)
	 printf("%d\n",sum);
	else
	 printf("?\n");
}

int main()
{
    
    
	int i;
	
	while(scanf("%d%d",&m,&n)!=EOF)
	{
    
    
	    init();
	    
		for(i=0;i<n;i++)
		  scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
        
        kruskal();
	}
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/qq_46139801/article/details/115278437
Recomendado
Clasificación