P3416 Floyd

上链接:
题目P3416
Floyd 本质就是一次选每个点为中间点,再看 i - j 和( i - k 与 k - j )的情况,求最短路的时候是判断前者与后者的距离关系并做更新,
Dijkstra ,则是维护目前最短的路径的终点 ,每次从这个终点开始寻找新的终点 , 看是否能得到更短的路径

本题是把求最短距离换成看是否连通

代码:

看懂题解直接搬过来了,莫怪懒鬼
#include<bits/stdc++.h>
using namespace std;
struct pos{
	double x,y,p;//建议用double保留精度
} cow[201];
double dis(pos a,pos b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));//求两点的欧几里得距离
}
int n,ans,con[201][201];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>cow[i].x>>cow[i].y>>cow[i].p;
	for(int i=1;i<=n;i++)
		for(int l=1;l<=n;l++)
			con[i][l]=(dis(cow[i],cow[l])<=cow[i].p);//直接计算结果,返回1或0
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int l=1;l<=n;l++)
				con[i][l]=con[i][l]||con[i][k]&&con[k][l];//可以直接这样写,偷懒利器
	for(int i=1;i<=n;i++)
	{
		int vis=0;
		for(int l=1;l<=n;l++)
			vis+=con[i][l];
		ans=max(ans,vis);//统计结果,更新ans
	}
	cout<<ans;
	return 0;
}

求的是各点是否连通,也可以DFS:

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
int n,ans,x,y,p,cnt=1,vis[210];
struct COW{
	int x,y;
	double p;
}cow[210];
double dis(COW a,COW b)
{
	return sqrt(abs(a.x-b.x)*abs(a.x-b.x)+abs(a.y-b.y)*abs(a.y-b.y));
}
void dfs(int i)
{
	for(int j=1;j<=n;j++)
	{
		double leng=dis(cow[i],cow[j]);
		if(leng<=cow[i].p && vis[j]==0)
		{
			vis[j]=1;
			cnt++;
			dfs(j);
		}
	}
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>cow[i].x>>cow[i].y>>cow[i].p;
	}
	for(int i=1;i<=n;i++)
	{
		vis[i]=1,dfs(i);
		ans=max(ans,cnt);
		cnt=1;
		memset(vis,0,sizeof(vis));
	}
	cout<<ans;
	return 0;
}
posted @   石磨豆浆  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示