PKU 1826 The Best Farm

http://poj.org/problem?id=1826
2次元に散らばった正方形に値が設定されている。
連結な正方形の値の和の最大値を求めろというような問題。

定数倍高速化を頑張る必要があるよう?
queueを配列にしたら通りました。

int ret,c;
int in(){
  while(!isdigit(c=getchar()))
    if(c=='-')return -in();
  ret=c&15;
  while(isdigit(c=getchar()))ret=(ret<<3)+(ret<<1)+(c&15);
  return ret;
}

typedef struct _node{
  int x,y;
  int idx;
  _node * next;
}node;

node ent[200000];
int sz;
const int hashMod=(1<<20)-1;
node* hash[hashMod+1];
int q[300000];
int s,e;

void insert(int x,int y,int idx){
  int ha=((x*1007+y)%hashMod+hashMod)%hashMod;
  for(node*p=hash[ha];p;p=p->next)
    if(p->x==x && p->y==y)return;
  node*p=ent+sz++;
  p->x=x;
  p->y=y;
  p->idx=idx;
  p->next=hash[ha];
  hash[ha]=p;
}

int geti(int x,int y){
  int ha=((x*1007+y)%hashMod+hashMod)%hashMod;  
  for(node*p=hash[ha];p;p=p->next)
    if(p->x==x && p->y==y)return p->idx;
  return -1;
}

int n;
int ix[200000],iy[200000],iv[200000];
bool vis[200000];

void solve(){
  sz=0;
  memset(hash,0,sizeof(hash));
  memset(vis,0,sizeof(vis));

  rep(i,n){
    ix[i]=in();
    iy[i]=in();
    iv[i]=in();
    insert(ix[i],iy[i],i);
  }
  int ans=0;
  rep(i,n){
    if(vis[i])continue;
    s=e=0;
    q[e++]=i;
    int tans=iv[i];
    vis[i]=true;
    while(e-s>0){
      int id=q[s++];
      rep(j,4){
        int nx=ix[id]+dx[j],ny=iy[id]+dy[j];
        int nid=geti(nx,ny);
        if(nid==-1 || vis[nid])continue;
        vis[nid]=true;
        tans+=iv[nid];
        q[e++]=nid;
      }
    }
    ans=max(ans,tans);
  }
  printf("%d\n",ans);
}

main(){
  while(n=in())
    solve();
}