C++とテンプレートの照合

3188 ワード

説明:
このテンプレートの比較を学習して洛谷P 3367【テンプレート】を推薦してセットを調べて、以下はこの問題のリンクと説明です:https://www.luogu.org/problemnew/show/P3367
タイトルの説明
問題のように、集計とクエリーの操作を完了する必要があります.
入力形式:
第1行は、N個の要素とM個の動作を共有することを示す2つの整数N、Mを含む.次のM行は、各行が3つの整数Zi、Xi、Yiを含む.Zi=1の場合、XiとYiが存在する集合をマージする.Zi=2の場合、出力XiとYiが同じ集合内にあるかどうか、そうであればYを出力する.そうでなければ出力N
出力フォーマット:
以上のように、各Zi=2の操作に対して、1行の出力があり、各行にはYまたはNの大文字が含まれている
サンプル#1を入力:
4 7 2 1 2 1 1 2 2 1 2 1 3 4 2 1 4 1 2 3 2 1 4
出力サンプル#1:
N Y N Y
説明
時空制限:1000 ms,128 M
データ規模:
30%のデータに対して、N<=10、M<=20;70%のデータに対して、N<=100、M<=1000;100%のデータに対して、N<=10000、M<=20000である.
ヒント:
各要素の父親を捕まえるには、パス圧縮を合理的に適用します.ルートノードを検索した後、再帰がてらパス上の要素の父親をルートノードに指します.コードが長くありません.
コード:
#include
#include
#include
#include
#include
#include
#define N 1000001
using namespace std;
int f[N],n,m;
int find(int k)
{
    if(k!=f[k]) f[k]=find(f[k]);
    return f[k];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&z,&x,&y);
        x=find(x);
        y=find(y);
        if(z==1&&x!=y) f[x]=y;
        if(z==2)
        {
            if(x==y) printf("Y
"
); else printf("N
"
); } } return 0; }
関連リンク:
C++テンプレートステーション:https://blog.csdn.net/zj_mrz/article/details/80950647
C++高速べき乗テンプレート:https://blog.csdn.net/zj_mrz/article/details/80950616
C++高精度減算テンプレート:https://blog.csdn.net/zj_mrz/article/details/80965324
C++高精度乗算テンプレート:https://blog.csdn.net/zj_mrz/article/details/80967394
転載先:https://www.cnblogs.com/zj-mrz/p/10122458.html