POJ 2421 Constructing Roads(Kruskal算法)

题意:给出n个村庄之间的距离,再给出已经连通起来了的村庄。求把所有的村庄都连通要修路的长度的最小值。

思路:Kruskal算法

课本代码:

//Kruskal算法
#include<iostream>
using namespace std;

int fa[120];
int get_father(int x){
	return fa[x]=fa[x]==x?x:get_father(fa[x]);//判断两个节点是否属于一颗子树(并查集)
}
int main(){
	int n;
	int p[120][120];
	while(scanf("%d",&n)!=EOF){
		int i,j,k,m;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				scanf("%d",&p[i][j]);
			for(i=0;i<n;i++) fa[i]=i;
			scanf("%d",&m);
			while(m--){
				int a,b;
				scanf("%d%d",&a,&b);
				fa[get_father(a-1)]=get_father(b-1);// a  合并到 b
			}
			int ans=0;
			for(k=1;k<=1000;k++)// kruskal 算法,这里每个长度都进循环,若加一个长度存在的标记,可以节省时间
				for(i=0;i<n;i++)
					for(int j=0;j<n;j++)
						if(p[i][j]==k &&get_father(i)!=get_father(j)){
							fa[fa[i]]=fa[j];//合并两颗子树(并查集)
							ans+=k;
						}
			printf("%d\n",ans);
	}
	return 0;
}

代码2:加了mark标记长度是否存在,代码中-------------为添加部分

//Kruskal算法
#include<iostream>
using namespace std;

int fa[120];
int mark[1010];//-------------标记长度是否存在
int get_father(int x){
	return fa[x]=fa[x]==x?x:get_father(fa[x]);//判断两个节点是否属于一颗子树(并查集)
}
int main(){
	int n;
	int p[120][120];
	while(scanf("%d",&n)!=EOF){
		memset(mark,0,sizeof(mark));
		int i,j,k,m;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++){
				scanf("%d",&p[i][j]);
				mark[p[i][j]]=1;//-------------把当前的长度标记一下
			}
			for(i=0;i<n;i++) fa[i]=i;
			scanf("%d",&m);
			while(m--){
				int a,b;
				scanf("%d%d",&a,&b);
				fa[get_father(a-1)]=get_father(b-1);// a  合并到 b
			}
			int ans=0;
			for(k=1;k<=1000;k++)// kruskal 算法
				if(mark[k]){// -------------------长度存在的时候,再进入这个循环
					for(i=0;i<n;i++)
						for(int j=0;j<n;j++)
							if(p[i][j]==k &&get_father(i)!=get_father(j)){
								fa[fa[i]]=fa[j];//合并两颗子树(并查集)
								ans+=k;
							}
				}
				printf("%d\n",ans);
	}
	return 0;
}

POJ 2421 Constructing Roads(Kruskal算法)

时间: 2024-10-12 03:59:46

POJ 2421 Constructing Roads(Kruskal算法)的相关文章

POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 8315 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each

poj 2421 Constructing Roads(kruskal)(基础)

Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20643   Accepted: 8697 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each

POJ 2421 Constructing Roads 修建道路 最小生成树 Kruskal算法

题目链接:POJ 2421 Constructing Roads 修建道路 Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19698   Accepted: 8221 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that e

HDU 1102 &amp;&amp; POJ 2421 Constructing Roads (经典MST~Prim)

链接:http://poj.org/problem?id=2421  或   http://acm.hdu.edu.cn/showproblem.php?pid=1102 Problem Description There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We

POJ 2421 Constructing Roads (最小生成树)

Constructing Roads Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2421 Appoint description:  System Crawler  (2015-05-27) Description There are N villages, which are numbered from 1 to N, and y

POJ 2421 Constructing Roads(最小生成树)

题意  在n个村庄之间修路使所有村庄连通  其中有些路已经修好了  求至少还需要修多长路 还是裸的最小生成树  修好的边权值为0就行咯 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int N = 105, M = 10050; int par[N], n, m, mat[N][N]; int ans; str

POJ - 2421 Constructing Roads (最小生成树)

There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a

POJ 2421 Constructing Roads

题意:要在n个城市之间建造公路,使城市之间能互相联通,告诉每个城市之间建公路的费用,和已经建好的公路,求最小费用. 解法:最小生成树.先把已经建好的边加进去再跑kruskal或者prim什么的. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #includ

[kuangbin带你飞]专题六 最小生成树 POJ 2421 Constructing Roads

给一个n个点的完全图 再给你m条道路已经修好 问你还需要修多长的路才能让所有村子互通 将给的m个点的路重新加权值为零的边到边集里 然后求最小生成树 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<string> 7 #define cl(a,b) memset(a