我是传送门~
- 分析:
- 方法一:二分查找最小的时间,用并查集,如果两个点之间的距离小于等于时间t*2,则两个点可以合为并集;遍历完所有点后查看是否都满足。
- AC代码:
#include#include #include using namespace std; struct node { int x,y; }a[55]; int n,d[55][55],fa[55]; inline int abs(int x) { return x>0?x:-x; } int juli(node n1,node n2) { return abs(n1.x-n2.x)+abs(n1.y-n2.y); } int find(int x) { if(x==fa[x]) return x; else return fa[x]=find(fa[x]); } bool check(int x) { for(int i=1;i<=n;i++) fa[i]=i;//先规定好每个点的父亲节点 for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(d[i][j]<=x*2)//同样的距离小于两倍的时间,规律 { int fx=find(i),fy=find(j); //先找到自己共同的祖先,就是要相交的时候到达的点 if(fx!=fy) fa[fx]=fy; //如果不一样的话,将其中一个与另一个变为一样的 } int sum=0; for(int i=1;i<=n;i++) { if(fa[i]==i) sum++;//祖先相同的话,这样的走向就成立 if(sum==2) return false; } return true; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y); for(int i=1;i<=n;i++) for(int j=1;j 方法二:用floyd,注意用x,y两个数组共用一组序号表示坐标点;还有相邻相接的问题。
AC代码:#include#include #include using namespace std; int x[55],y[55],w[55][55]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); for(int i=1;i<=n;i++) for(int j=1;j



