蒟蒻求助(并查集做法)

P3958 [NOIP2017 提高组] 奶酪

@[Steve_braveman](/space/show?uid=96570) 没细看,发现两个问题 1. ```cpp void init(){ memset(fa,0,sizeof(fa));//这句干什么?没有用,后面会赋值,应该去掉 for(int i=1;i<=n;i++){ fa[i]=i; } } ``` 2. ```cpp for(int y=1;y<=t;y++){ init();//不对吧,先读入n,再初始化 int k=0,p=0; bool flag1=0; bool flag2=0; scanf("%lld%lld%lld",&n,&h,&r); ```
by agicy @ 2018-08-30 16:14:02


@[Steve_braveman](/space/show?uid=96570) 你的代码: ```cpp void un(ll a,ll b){ ll w=find(a); ll e=find(b); fa[b]=a; } ``` 应该是: ```cpp void un(ll a,ll b){ ll w=find(a); ll e=find(b); if(w!=e) fa[e]=w; return; } ```
by agicy @ 2018-08-30 16:19:04


@[卢安来](/space/show?uid=38502) 改了之后更加不对了。。。
by RiverFun @ 2018-08-30 16:26:10


@[Steve_braveman](/space/show?uid=96570) 刚刚对着你的程序改了一遍,没有提交过,你自己看一看。 ```cpp #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define ll long long using namespace std; ll n,h,r,up[1005],down[1005],fa[1005]; struct sphere{ ll x,y,z; }a[1005]; ll find(ll a){ if(fa[a]==a) return a; else return fa[a]=find(fa[a]); } void un(ll a,ll b){ ll w=find(a); ll e=find(b); if(w!=e) fa[e]=w; return; } bool chk(sphere a,sphere b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z))<=r*2;//这样更简洁 } int main(){ int t; scanf("%d",&t); for(int y=1;y<=t;y++){ int k=0,p=0; bool flag1=0; bool flag2=0; memset(up,0,sizeof(up)), memset(down,0,sizeof(down));//你没初始化两个数组 scanf("%lld%lld%lld",&n,&h,&r); for(int i=1;i<=n;i++){ fa[i]=i; }//初始化fa数组 for(int i=1;i<=n;i++){ scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z); //a[i].g=i;//存序号干什么? if((a[i].z+r)>=h){ k++; up[k]=i; flag1=1; } if((a[i].z-r)<=0){ p++; //down[k]=i;你写错了吧 down[p]=i; flag2=1; } } if((flag1==0)||(flag2==0)){ printf("No\n"); continue; } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ if(chk(a[i],a[j])){ un(i,j);//i,j就是序号 } } } bool lt=0; for(int i=1;i<=k;i++){ for(int j=1;j<=p;j++){ int aa=find(up[i]); int bb=find(down[j]); if(aa==bb){ lt=1; break; } } if(lt) break; } if(lt){ printf("Yes\n"); } else { printf("No\n"); } } return 0; } ```
by agicy @ 2018-08-30 16:32:37


@[卢安来](/space/show?uid=38502) 已经A了,谢谢dalao
by RiverFun @ 2018-08-31 18:40:34


|