hdu 1102 Constructing Roads(kruskal || prim)

求最小生成树,有一点点的变化,就是有的边已经给出来了,所以,最小生成树里面必须有这些边,kruskal和prim算法都可以,prim更简单一些,有一点需要注意,用克鲁斯卡尔算法的时候需要将已经存在的边预处理一下,并查集转化为同一个祖先,记得要找他们的祖先再转化。普里姆算法只需要将那些已经存在的边都初始化为0就可以了。

kruskal:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAX 0x7fffffff

using namespace std;
struct node
{
	int i,j,len;
}gra[10005];
int p[105];
int n;
int cmp(const void *a,const void *b)
{
	return ((node *)a)->len - ((node *)b)->len;
}
int find(int x)
{
	return p[x] == x? x: (p[x] = find(p[x]));
}
void kruskal()
{
	int i,sum = 0;
	for(i=1; i<=n*n; i++)
	{
		int x = find(gra[i].i);
		int y = find(gra[i].j);
		if(x != y)
		{
			sum += gra[i].len;
			p[x] = y;
		}
	}
	cout << sum << endl;
	return ;
}
int main()
{
	int i,j,m,c;
	while(cin >> n)
	{
		int k = 1;
		for(i=1; i<=n; i++)
			for(j=1; j<=n; j++)
				{
					cin >> c;
					gra[k].i = i;
					gra[k].j = j;
					gra[k].len = c;
					k ++;
				}
		cin >> m;
		for(i=1; i<=n; i++)
			p[i] = i;
		int a ,b;
		for(i=1; i<=m; i++)
		{
			cin >> a >> b;
			a = find(a);//注意这里,wa了几次。。。要找他们的祖先。。。
			b = find(b);
			p[a] = b;
		}
		qsort(gra+1,k-1,sizeof(gra[0]),cmp);
		kruskal();
	}
	return 0;
} 

prim:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAX 0x7fffffff

using namespace std;
int gra[105][105];
int n;
void prim()
{
	int visit[105],now,i,j;
	int d[105];
	memset(visit,0,sizeof(visit));
	for(i=1; i<=n; i++)
		d[i] = MAX;
	now = 1;visit[1] = 1;
	d[1] = 0;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=n; j++)
			if(!visit[j] && d[j]>gra[now][j])
				d[j] = gra[now][j];
		int MIN = MAX;
		for(j=1; j<=n; j++)
		{
			if(!visit[j] && MIN > d[j])
				MIN = d[now=j];
		}
		visit[now] = 1;
	}
	int sum = 0;
	for(j=1; j<=n; j++)
		sum += d[j];
	cout << sum << endl;
	return ;
}
int main()
{
	int i,j,c;
	while(cin >> n)
	{
		for(i=1; i<=n; i++)
			for(j=1; j<=n; j++)
			{
				cin >> c;
				gra[i][j] = c;
			}

		int m,a,b;
		cin >> m;
		for(i=1; i<=m; i++)
		{
			cin >> a >> b;
			gra[a][b] = gra[b][a] = 0;
		}
		prim();
	}
	return 0;
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 14:23:28

hdu 1102 Constructing Roads(kruskal || prim)的相关文章

HDU 1102 Constructing Roads, Prim+优先队列

题目链接:HDU 1102 Constructing Roads Constructing Roads 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 say two village A and B are conne

hdu 1102 Constructing Roads (Prim算法)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21947    Accepted Submission(s): 8448 Problem Description There are N villa

hdu 1102 Constructing Roads 最小生成树Prim算法AC 水~~~

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15230    Accepted Submission(s): 5826 Problem Description There are N villages, which are numbered from 1 to N, and you should

HDU 1102 Constructing Roads(kruskal)

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,

hdu 1102 Constructing Roads(最小生成树 Prim)

题目链接: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 say two village A and B are conne

HDU 1102 Constructing Roads (裸的并查集)

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13210    Accepted Submission(s): 4995 Problem Description There are N villages, which are numbered from 1 to N, and you should

hdu 1102 Constructing Roads (最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14172    Accepted Submission(s): 5402 Problem Description There are N villa

HDU 1102 Constructing Roads (最小生成树)

最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1表示原图不连通 */ const int INF = 0x3f3f3f3f; const int MAXN = 110; bool vis[MAXN]; int lowc[MAXN]; int map[MAXN][MAXN]; int Prim(int cost[][MAXN], int n) {

HDU 1102 Constructing Roads【简单最小生成树,Prime算法+Kruskal算法】

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20765    Accepted Submission(s): 7934 Problem Description There are N villages, which are numbered from 1 to N, and you should