poj 2253 (二分+判斷圖連通)

題意:給出n個島的座標,要從第一個到跳到第二個島,跳的時候有個距離限制,求出這個距離的最小值。

思路:剛開始限制距離爲兩島的直接距離,用二分每得到一個距離mid,判斷1個2是否能連通。就求出最小的限制距離了。





#include<string.h>
#include<math.h>
#include<stdio.h>
const int N=210;
int f[N],n;
double map[N][N];
struct node
{
	int x,y;
}p[N];
double dist(int i,int j)
{
	return sqrt(1.0*(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
int find(int a)
{
	if(a!=f[a])f[a]=find(f[a]);
	return f[a];
}
int judge(double D)
{
	int i,j;
	for(i=1;i<=n;i++)
		f[i]=i;
	for(i=1;i<=n;i++)
	{
		for(j=i+1;j<=n;j++)
			if(map[i][j]<D)//小於限制的距離
			{
				f[find(i)]=find(find(j));
			}
	}
	if(find(1)==find(2))return 1;
	return 0;
}
int main()
{
	int i,j,op=1;
	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&p[i].x,&p[i].y);
			for(j=1;j<i;j++)
			{
				map[i][j]=map[j][i]=dist(i,j);
			}
		}
		double left,right,mid;
		left=0;right=map[1][2];
		while(right-left>1e-7)
		{
			mid=(left+right)/2;
			if(judge(mid))
			{
				right=mid;
			}
			else left=mid;
		}
		printf("Scenario #%d\n",op++);
		printf("Frog Distance = %.3f\n\n",right);
	}
	return 0;
}


發佈了236 篇原創文章 · 獲贊 3 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章