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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架