基本的な考え方:
その使用方法は、直接記録を設定するには、直接2つのトラバースを追加するにはあまりにも厄介ですが、それは価値のサンプルコードを学んでいます。
キーポイント:
セット組合交差点に考えたのは、SET、直接第二トラバースの数の直接のレコードを持つことができます。
最初set.findを使用する場合、+1交差点直接記録同じ要素番号を見つけ、異なる要素、+1要素の交点を見つけます。
二重電荷(int型 A、INT B){ ダブル JN = 0、BN = 0 ; BN = VEC [A] .size(); のための(自動IT VEC = [B] .begin(); IT VEC = [B! ] .END(); IT ++ ){ IF(VEC [A] .find(IT *)=!VEC [A] .END()){ // 同じ要素を見つけた場合、 JN ++ ; } 他{ BN ++ ; } } 戻り JN / BNを; }
全体のコード:
#include <iostreamの> する#include <STDLIB.H> する#include <stdio.hに> する#include <ベクトル> の#include < ストリング > の#include <math.h>の 書式#include <アルゴリズム> の#include <CStringの> する#include <地図> 書式#include <キュー> の#include < セット > 使用して 名前空間はstdを、 整数N、M。 ベクトル < セット < int型 >> VEC。 二重電荷(int型 A、= JN 0、BN = 0 ; BN = VEC [A] .size(); のための(自動IT VEC = [B] .begin(); IT VEC = [B] .END();! IT ++ ){ IF( VEC [A] .find(IT *)=!VEC [A] .END()){ // 同じ要素を見つけた場合は、 JN ++ ; } 他{ BN ++ ; } } 返す JN / BNを; } int型(メイン) { scanfの(" %のD "、およびN-); int型A、B、 のために(int型私は= 0を。I <N; I ++ ){ セット < INT > S。 scanf関数(" %のD "、& )。 用(INT J = 0 ; J <; J ++ ){ scanf関数(" %のD "、&B)。 s.insert(B)。 } vec.push_back(S); } のscanf(" %dの"、&M)。 以下のために(INT iが= 0 ; I <M、I ++){ scanf関数(" %D%D "、&、&B)。 二重再=電荷( - 1、B - 1)* 100 。 // coutの<<再<<てendl; printf(" %.1lf %% \ n " 、RE)。 } 戻り 0 。 }