AOJ : 2191 - 挨拶の多い本屋さん (A Book Shop With a Frequent Greetings)

アルゴリズム

始点から順番にシミュレートして, ある程度時間がたっても鳴り止まないようなら, ループを中断する.
↑ある程度っていうのは, 僕もはっきりわからないので, 1000回程度挨拶したら, 中断するようにしてます.

プログラム

int tm[1000];
int x[1000],y[1000];

int main(void){
  int n;
  cin>>n;

  while(n--){
    int N,X,Y;
    double sx,sy;
    cin>>N>>X>>Y>>sx>>sy;

    for(int i=0;i<N;i++) cin>>x[i]>>y[i];

    vector<int> t[N];
    for(int i=0;i<N-1;i++){
      for(int j=i+1;j<N;j++){
        if((x[j]-x[i])*(x[j]-x[i]) + (y[j]-y[i])*(y[j]-y[i]) <= 2500){
          t[i].push_back(j);
          t[j].push_back(i);
        }
      }
    }
    vector<int> v;
    for(int i=0;i<N;i++) tm[i] = -999999999;

    int ans = 0;
    for(int i=0;i<N;i++){
      if((sx-x[i])*(sx-x[i]) + (sy-y[i])*(sy-y[i]) <= 100){
        v.push_back(i);
        ans = tm[i] = X;
      }
    }

    int loop = 10000;
    while(!v.empty() && loop>0){
      vector<int> nv;
      for(int i=0;i<v.size();i++){
        int from = v[i];
        for(int j=0;j<t[from].size();j++){
          int to = t[from][j];

          if(tm[from] - Y > tm[to]){
            nv.push_back(to);
            ans = tm[to] = tm[from] + X;
          }
        }
      }

      v = nv;
      loop--;
    }

    if(loop == 0)
      cout<<"You're always welcome!\n";
    else
      cout<<ans<<endl;
  }

  return 0;
}