您的位置:首页 > 产品设计 > UI/UE

zoj 2966 Build The Electric System ( prim || kruskal~ )

2010-09-16 14:55 190 查看
做的这几道基本都是一样的。。。。



prim纠结死了,SE了好多次。。。后来发现是要在赋值的时候 map[x][y] = map[y][x] = len; 原来忘了把两条路都弄上,只弄了一个。。。



kruskal很顺当。。。我应该学学党那种优先队列的方法了。。。



PRIM

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define N 510
using namespace std;
int map

,hash
,dis
,start,n,e;
void input()
{
	int i,j,x,y,len;
	cin >> n >> e;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
	        map[i][j] = INT_MAX;
	}
	for(i=0; i<e; i++)
	{
		cin >> x >> y >> len;
		map[x][y] = map[y][x] = len;
	}
}
void prim()
{
	int i,j,min,sum,now;
	for(i=1; i<=n; i++)
	{
		dis[i] = INT_MAX;
		hash[i] = 0;
	}
	now = 0; dis[now] = 0;
	hash[now] = 1;
	for(j=1; j<=n; j++)
	{
		for(i=0; i<n; i++)
			if( !hash[i] && map[now][i] < dis[i] )
				dis[i] = map[now][i];
		min = INT_MAX;
		for(i=0; i<n; i++)
			if(!hash[i] && dis[i] < min )
				min = dis[now = i];
		hash[now] = 1;
	}
	sum = 0;
	for(i=0; i<n; i++)
	    sum += dis[i];
	cout << sum << endl;
}
int main(void)
{
	int ncases;
	cin >> ncases;
	while( ncases-- )
	{
		input();
		prim();
	}
return 0;
}




kruskal

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define N 510
using namespace std;
int n,p,pre
,e;
struct C
{
	int x,y,len;
}city[N * (N - 1) / 2];
typedef struct C NODE;
void input()
{
	int i;
	cin >> n >> e;
	for(i=0; i<e; i++)
	{
		cin >> city[i].x >> city[i].y >> city[i].len;
	}
}
int cmp(const void *a,const void *b)
{
	return ((NODE*)a)->len > ((NODE*)b)->len ? 1 : -1;
}
int find(int x)
{
	while(x!=pre[x])
		x = pre[x];
	return x;
}
void kruskal()
{
	int i,sum = 0,a,b;
	qsort( city, e, sizeof(NODE), cmp);
	for(i=0; i<n; i++)
		pre[i] = i;
	for(i=0; i<e; i++)
	{
		a = find( city[i].x );
		b = find( city[i].y );
		if( a!= b )
		{
			sum += city[i].len;
			pre[b] = a;
		}
	}
	cout << sum << endl;
}
int main(void)
{
	int ncases;
	cin >> ncases;
	while( ncases-- )
	{
		input();
		kruskal();
	}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: