Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph ACM解题报告(并查集)

今天敲题都不在状态,就A题那种水题居然看出来方法了没做,换了个方法WA了一下午,第二题看见graph就条件反射是图论,各种搜索感觉烦爆了,后来经过学长提醒并查集才顿悟(ps.为啥每次都是学长提醒呢)

首先这题是一个图,两点之间的边有颜色,而且不止是一种颜色,如果用二维数组的并查集记录每种颜色中的路径,直接查询就很方便了,省去了搜索的繁琐(还容易错)。

话不多说直接看代码吧=。=

#include<iostream>
#include<cstdio>
using namespace std;
int pre[105][105];
int Find(int x,int col)
{
    int r=x;
    while(pre[r][col]!=r)
    {
        r=pre[r][col];
    }
    int i=x,j;
    while(pre[i][col]!=r)
    {
        j=pre[i][col];
        pre[i][col]=r;
        i=j;
    }
    return r;
}
void mix(int x,int y,int z)
{
    int fx=Find(x,z);
    int fy=Find(y,z);
    if(fx!=fy) pre[fx][z]=fy;
}
int main()
{
    int a,b,c,n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) pre[i][j]=i;
    }
    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>c;
        mix(a,b,c);
    }
    int q;
    cin>>q;
    int x,y;
    while(q--)
    {
        cin>>x>>y;
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            if(Find(x,i)==Find(y,i)) ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(ACM)