Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define PB push_back
- #define ZERO (1e-10)
- #define INF (1<<30)
- #define LINF (1LL<<60)
- #define NINF -INF
- #define CL(A,I) (memset(A,I,sizeof(A)))
- #define add(A,B) (g[A].PB(B),g[B].PB(A))
- #define ADD(A,B,V) (add(A,B),v[A].PB(V),v[B].PB(V))
- #define DEB printf("DEB!\n");
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
- typedef long long ll;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef pair<int,int> ii;
- #define REP(i, n) for (int i = 0; i < n; i++)
- #define F(W) REP(i,W)
- #define FF(W) REP(j,W)
- #define FT(I,W) for(int k(I);k<W;++k)
- #define IN(n) int n; cin >> n;
- #define PR(A,X) (X?A.second:A.first)
- #define MX (2048)
- #define dd(AX,AY,AZ,BX,BY,BZ) ((AX-BX)*(AX-BX)+(BY-AY)*(BY-AY)+(BZ-AZ)*(BZ-AZ))
- vi g[MX];
- int N,x[MX],y[MX],z[MX],I,h,w,o;
- int D[MX],U[MX];
- void dw(int u,int p,int d,int *D){
- D[u]=d;
- for(auto i:g[u])if(i!=p)
- dw(i,u,d+1,D);
- }
- ii ctr(int N,int r=0){
- int R,d(0),l(-1);
- dw(r,-1,0,D);
- F(N)if(D[i]>d)d=D[R=i];
- dw(R,-1,d=0,D);
- F(N)if(D[i]>d)d=D[l=i];
- dw(l,-1,0,U);
- d=D[l]>>1;
- if(!(D[l]&1))F(N)if(D[i]==U[i]&&D[i]==d)return {i,-1};
- ii B;
- F(N)if(D[i]==d&&U[i]==d+1)PR(B,1)=i;
- else if(D[i]==d+1&&U[i]==d)PR(B,0)=i;
- return B;
- }
- int ID[MX];
- int main(void){
- while(scanf("%d",&N),N){
- scanf("%d%d%d%d",&o,x,y,z);*ID=o;
- FT(1,N){
- scanf("%d%d%d%d",&o,x+k,y+k,z+k);ID[k]=o;
- h=INF;
- F(k)if((w=dd(x[i],y[i],z[i],x[k],y[k],z[k]))<h)h=w,I=i;
- add(k,I);
- }
- ii A(ctr(N));
- if(~PR(A,1))printf("%d %d\n",min(ID[PR(A,0)],ID[PR(A,1)]),max(ID[PR(A,0)],ID[PR(A,1)]));
- else printf("%d\n",ID[PR(A,0)]);
- for(auto &v:g)v.clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment