PKU 1570 Exchange Rates

http://poj.org/problem?id=1570
物々交換のレートのようなものと、現在のあるアイテムaとアイテムbの交換レートを尋ねるクエリが与えられるので、それを順次処理していくというような問題。

幅優先探索
デバッグのためのコードをつけていたせいでWAになっていて、多少はまりました。

map<string,vector<pair<string,PI> > >edge;

main(){
  char c;

  while(cin>>c,c!='.'){

    if(c=='!'){
      int a,b;
      string ita,itb;
      cin>>a>>ita>>c>>b>>itb;

      int g=__gcd(a,b);
      edge[ita].pb(mp(itb,mp(a/g,b/g)));
      edge[itb].pb(mp(ita,mp(b/g,a/g)));
    }else{
      string ita,itb;
      cin>>ita>>c>>itb;
      set<string> vis;
      queue<pair<string,PI> >q;
      q.push(mp(ita,mp(1,1)));
      bool ok=false;
      while(!q.empty()){
        string v=q.front().F;
        PI cc=q.front().S;
        q.pop();
        if(vis.count(v))continue;
        vis.insert(v);
        if(v==itb){
          cout<<cc.S<<' '<<ita<<" = "<<cc.F<<' '<<itb<<endl;
          ok=true;
          break;
        }
        const vector<pair<string,PI> >& ed=edge[v];
        rep(i,SZ(ed)){
          if(vis.count(ed[i].F))continue;
          PI nc=cc;
          nc.F*=ed[i].S.S;
          nc.S*=ed[i].S.F;
          int g=__gcd(nc.F,nc.S);
          nc.F/=g;
          nc.S/=g;
          q.push(mp(ed[i].F,nc));
        }
      }
      if(ok)continue;
      cout<<"? "<<ita<<" = ? "<<itb<<endl;
    }
  }
}