最小生成树--prim--Constructing Roads

最小生成树–prim–Constructing Roads

Description
这里有N个村庄,编号从1到N,你应该修建一些道路,这样每两个村庄就可以连接起来。我们说两个村庄A和B是相连的,当且仅当A和B之间有一条路,或者有一个C村,使得A和C之间有一条路,C和B是相连的。
我们知道,在一些村庄之间已经有一些道路,你的工作是建造一些道路,这样所有的村庄都连接在一起,所有道路的长度都是最小的。

Input
第一行是整数N(3<=N<=100),它是村庄的数目。然后出现N条线,其中的I-包含N个整数,而这些N个整数的j-是i村和j村之间的距离(距离应该是[1,1000]内的整数)。
然后有一个整数q(0<=q<=N*(N+1)/2)。然后是Q线,每一行包含两个整数a和b(1<=a<b<=N),这意味着村庄a和b村之间的道路已经建成。

Output
您应该输出一个包含整数的行,它是所有要建的道路的长度,这样所有的村庄都连接在一起,并且这个值是最小的。

Sample Input
3
0 990 692
990 0 179
692 179 0
1
1 2
Sample Output
179

prim基础题,此题有修好的路,就将其权值赋值为0

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>

using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=1e3+5;
int n,m[MAX][MAX],d[MAX];
bool f[MAX];
int prim()
{
	int num=0;
	memset(d,inf,sizeof(d));
	memset(f,true,sizeof(f));
	d[1]=0;
	int v=-1;
	while(true)
	{
		v=-1;
		for(int i=1;i<=n;i++)
		{
			if(f[i]&&(v==-1||d[v]>d[i]))
			v=i;
		}
		if(v==-1)	break;
		f[v]=false;
		num+=d[v];
		for(int i=1;i<=n;i++)
		{
			d[i]=min(d[i],m[v][i]);
		}
	}
	return num;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&m[i][j]);
		}
	}
	int a=0,x,y;
	scanf("%d",&a);
	for(int i=0;i<a;i++)
	{
		scanf("%d%d",&x,&y);
		m[x][y]=m[y][x]=0;
	}
	printf("%d",prim());
	return 0;
}
发布了19 篇原创文章 · 获赞 0 · 访问量 201

猜你喜欢

转载自blog.csdn.net/qq_45282116/article/details/104458132