您的位置:首页 > 其它

zoj 2326 || poj 2075 Tangled in Cables(MST)

2011-01-24 11:05 441 查看
很水的最小生成树。



给你两个城市之间的道路(无向图),求出需要的电缆。如果大于所提供的,就输出Not enough 。。。 否则输出所需要的电缆长度。



Prim。。。这题没有说城市数目。。。210SF 310AC了。。。估计就这两者之间吧。



如果数据量大点,是要优化的,可以用字典树查找城市名字。



#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#define INF 9999999.0
#define MAX 310
using namespace std;
char town[MAX][25];
double map[MAX][MAX];
int n;
double Prim()
{
	double dis[MAX],min,ans;
	int used[MAX],i,k,now;
	for(i=1; i<=n; i++)
		dis[i] = INF;
	memset(used,0,sizeof(used));
	now = 1;
	used[now] = 1;
	dis[now] = 0;
	for(i=1; i<=n; i++)
	{
		for(k=1; k<=n; k++)
			if( !used[k] && dis[k] > map[now][k] )
				dis[k] = map[now][k];
		min = INF;
		for(k=1; k<=n; k++)
			if( dis[k] < min && !used[k] )
				min = dis[now = k];
		used[now] = 1;
	}
	ans = 0;
	for(i=1; i<=n; i++)
		if( dis[i] != INF )
			ans += dis[i];
		else
			return -1;
	return ans;
}
int main()
{
	char a[25],b[25];
	double cabs,len,ans;
	int i,m,aa,bb,k;
	scanf("%lf%d",&cabs,&n);	
	for(i=1; i<=n; i++)
		for(k=1; k<=n; k++)
			map[i][k] = INF;
	for(i=1; i<=n; i++)
		scanf("%s",town[i]);
	scanf("%d",&m);
	while( m-- )
	{
		scanf("%s%s%lf",a,b,&len);
		aa = bb = 0;
		for(i=1; i<=n; i++)
		{
			if( aa && bb ) break;
			if( strcmp(a,town[i]) == 0 )
				aa = i;
			if( strcmp(b,town[i]) == 0 )
				bb = i;
		}
		map[aa][bb] = map[bb][aa] = len;
	}
	ans = Prim();
	if( ans == -1 || ans > cabs )
		printf("Not enough cable/n");
	else
		printf("Need %.1lf miles of cable/n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: