hdu 4081 Qin Shi Huang's National Road System

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlh1998/article/details/76098674
//函数返回值写成int,函数内外用了ans,调试只能显示其中一个,
//垃圾dev半天没调出来 
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;

const int maxn = 1e3+10;
const int maxm = 1e6+10;
const int INF = 0x3f3f3f3f;


int fa[maxn];
int pre[maxm];
double pre1[maxn][maxn];
struct link{
	int node;
	int fir;
	int next;
	int las;
}links[maxn];
struct ver{
	int x;
	int y;
	int p;
}vers[maxn];
struct edge{
	
	int from;
	int to;
	double dist;
	
	bool operator < (const edge i)const{
		return dist < i.dist ;
	}
}edges[maxm];

int find(int x){
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}
double kruskal (int n, int m){
	for (int i = 0; i < n; i++)	{
		fa[i] = i;
		links[i].node = links[i].fir = links[i].las = i;
		links[i].next = -1;
	}
	sort(edges, edges+m);
	
	int cnt = 0;
	double ans = 0;
	
	for (int i = 0; i < m; i++){
		int t1 = find(edges[i].from );
		int t2 = find(edges[i].to );
		if (t1 != t2){
			
			for (int a = links[t1].fir ; a != -1; a = links[a].next ){
				for (int b = links[t2].fir ; b != -1; b = links[b].next ){
					int u = links[a].node;
					int v = links[b].node ;
					pre1[u][v] = pre1[v][u] = edges[i].dist ;
				}
			}
			pre[i] = 1;
			ans += edges[i].dist ;
			cnt++;
			fa[t1] = t2;
		           //t1接t2后 
			links[links[t2].las ].next = links[t1].fir ;			
			links[t1].fir = links[t2].fir ;
			links[t2].las = links[t1].las ;

		}
		if (cnt == n - 1)	break;
	}
	return (cnt < n - 1 ? -1: ans);
}

int main (){
	int t,m;
	scanf("%d",&t);
	int cun1,cun2,cost;

	for (int cas = 0; cas < t; cas++){
		scanf("%d", &m);
		int edgenum = 0;
		memset(pre,0,sizeof(pre));
		memset(pre1,0,sizeof(pre1));
		for (int i = 0; i < m; i++){
			scanf("%d%d%d", &vers[i].x ,&vers[i].y, &vers[i].p );
		}
		for (int i = 0; i < m; i++){
			for (int j = i + 1; j < m; j++){
				edges[edgenum].dist = sqrt(1.0*(vers[i].x - vers[j].x) * (vers[i].x - vers[j].x) +
										1.0*(vers[i].y - vers[j].y) * (vers[i].y - vers[j].y)) ;
				edges[edgenum].from = i;
				edges[edgenum].to = j;
				edgenum++;
			}
		}
		double mst = 0.0,maxans = 0.0;
		mst = kruskal(m,edgenum);
		maxans = 0;
			for (int i = 0; i < edgenum; i++){
				int up = vers[edges[i].from ].p;
				int vp = vers[edges[i].to ].p;
				double dis = edges[i].dist;
				if (pre[i] == 1){
					maxans = maxans > (up + vp) / (mst - dis )?
							maxans : (up + vp) / (mst - dis );
				}
				else maxans = maxans > (up + vp) / (mst - pre1[edges[i].from][edges[i].to])?
							maxans : (up + vp) / (mst - pre1[edges[i].from][edges[i].to]);
			}

		printf("%.2f\n",maxans);
	}
}

猜你喜欢

转载自blog.csdn.net/wlh1998/article/details/76098674
今日推荐