hdu 4081 最小生成树

 

先求出最小生成树,然后枚举树上的边,对于每条边“分别”找出这条割边形成的两个块中点权最大的两个

1.由于结果是A/B,A的变化会引起B的变化,两个制约,无法直接贪心出最大的A/B,故要通过枚举

2.不管magic road要加在哪里,加的边是否是最小生成树上的边,都会产生环,我们都要选择一条边删掉

注意删掉的边必须是树的环上的边,为了使结果最大,即找出最大的边

3.可以枚举两点,找出边,也可以枚举边,找出点,我是用后者,感觉比较容易写也好理解

 

 

 

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define N 1050
#define INF 1000000
struct point
{
	double x,y;
	int num;
}p[N];
int n;
double map[N][N],dist[N],A,B;
vectorvec[N];
double getdistance(point aa,point bb)
{
	return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));
}
int pre[N];
void prim()
{
	for(int i=1;i<=n;++i)
		dist[i]=INF*1.0;
	double min_edge;
	int min_p,now=1;
	for(int i=1;i0)
			{
				if(dist[i]>map[now][i])
					dist[i]=map[now][i],pre[i]=now;
			}
		dist[now]=-1.0;
		for(int i=1;i<=n;++i)
			if(dist[i]>0&&dist[i]ans)
					ans=res;
			}
		ans+=(1e-8);
		printf("%.2lf\n",ans);
	}
	//system("pause");
	return 0;
}


 

你可能感兴趣的:(图论,ACM)