Morass

Go Go Gorelians

Mar 26th, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<30)
  6. #define LINF (1LL<<60)
  7. #define NINF -INF
  8. #define CL(A,I) (memset(A,I,sizeof(A)))
  9. #define add(A,B) (g[A].PB(B),g[B].PB(A))
  10. #define ADD(A,B,V) (add(A,B),v[A].PB(V),v[B].PB(V))
  11. #define DEB printf("DEB!\n");
  12. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  13. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  14. typedef long long ll;
  15. typedef pair<ll,ll> pll;
  16. typedef vector<int> vi;
  17. typedef pair<int,int> ii;
  18. #define REP(i, n) for (int i = 0; i < n; i++)
  19. #define F(W) REP(i,W)
  20. #define FF(W) REP(j,W)
  21. #define FT(I,W) for(int k(I);k<W;++k)
  22. #define IN(n) int n; cin >> n;
  23. #define PR(A,X) (X?A.second:A.first)
  24. #define MX (2048)
  25. #define dd(AX,AY,AZ,BX,BY,BZ) ((AX-BX)*(AX-BX)+(BY-AY)*(BY-AY)+(BZ-AZ)*(BZ-AZ))
  26. vi g[MX];
  27. int N,x[MX],y[MX],z[MX],I,h,w,o;
  28. int D[MX],U[MX];
  29. void dw(int u,int p,int d,int *D){
  30.     D[u]=d;
  31.     for(auto i:g[u])if(i!=p)
  32.         dw(i,u,d+1,D);
  33. }
  34. ii ctr(int N,int r=0){
  35.     int R,d(0),l(-1);
  36.     dw(r,-1,0,D);
  37.     F(N)if(D[i]>d)d=D[R=i];
  38.     dw(R,-1,d=0,D);
  39.     F(N)if(D[i]>d)d=D[l=i];
  40.     dw(l,-1,0,U);
  41.     d=D[l]>>1;
  42.     if(!(D[l]&1))F(N)if(D[i]==U[i]&&D[i]==d)return {i,-1};
  43.     ii B;
  44.     F(N)if(D[i]==d&&U[i]==d+1)PR(B,1)=i;
  45.     else if(D[i]==d+1&&U[i]==d)PR(B,0)=i;
  46.     return B;
  47. }
  48. int ID[MX];
  49. int main(void){
  50.     while(scanf("%d",&N),N){
  51.         scanf("%d%d%d%d",&o,x,y,z);*ID=o;
  52.         FT(1,N){
  53.             scanf("%d%d%d%d",&o,x+k,y+k,z+k);ID[k]=o;
  54.             h=INF;
  55.             F(k)if((w=dd(x[i],y[i],z[i],x[k],y[k],z[k]))<h)h=w,I=i;
  56.             add(k,I);
  57.         }
  58.         ii A(ctr(N));
  59.         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)]));
  60.         else printf("%d\n",ID[PR(A,0)]);
  61.         for(auto &v:g)v.clear();
  62.     }
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment