HDU 1875 畅通工程再续

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlh1998/article/details/76034141
#include<stdio.h>
#include<string.h>
#include<math.h>

const int INF = 0x3f3f3f3f;
const int maxn = 1e3;
double mp[maxn][maxn];  // 存图; 
int vis[maxn];  //是否在新图内; 
double dis[maxn];  //第i个顶点到新图最短距离; 
double prim(int n);

struct node{
	double x;
	double y;
}nodes[maxn];
int n,m;
int main (){
	int t;
	scanf("%d",&t);
	int cun1,cun2,cost;
	double ans = 0;
	for (int cas = 0; cas < t; cas++){
		scanf("%d", &m);
		memset(mp,0x3f,sizeof(mp));
		for (int i = 0; i < m; i++){
			scanf("%lf%lf", &nodes[i].x ,&nodes[i].y);
		}
		for (int i = 0; i < m; i++){
			for (int j = 0; j < m; j++){
				mp[i][j] =sqrt((nodes[i].x - nodes[j].x) *(nodes[i].x - nodes[j].x) +
							(nodes[i].y - nodes[j].y) *(nodes[i].y - nodes[j].y)) ;
				if (mp[i][j] < 10 || mp[i][j] > 1000){
					mp[i][j] = INF;
				}			
			}
		}
		ans = prim(m);
		if (ans == -1)	printf("oh!\n");
		else printf("%.1f\n",ans*100);
	}
}

double prim(int n){
	double ans = 0;
	memset(vis,0,sizeof(vis));
	vis[0] = 1;   //注意第一个点的初始化; 
	for (int i = 0; i < n; i++)	dis[i] = mp[0][i]; // 新图第一个点为0,初始化dis; 
	for (int i = 1; i < n; i++){  // 加入第i+1个点 
		double minn = INF;  // 旧图到新图最短距离 
		int pos = -1;    // 旧图最近点标号; 
		for (int j = 0; j < n; j++){
			if(!vis[j] && minn > dis[j]) {
				minn = dis[j];
				pos = j;
			}
		}
		if (minn == INF) return -1;
		ans += minn;     //更新答案; 
		vis[pos] = 1;
		
		for (int j = 0; j < n; j++) {
			if (!vis[j] && mp[pos][j] < dis[j]){
				dis[j] = mp[pos][j];
			}
		}
	}
	return ans;
}

猜你喜欢

转载自blog.csdn.net/wlh1998/article/details/76034141