CF286-B

给定n个点和m条边,点编号从1~n,每条边有:起点,终点和颜色

问给定任意两点,求连接这两点所有颜色的数量.(如:红色要连接两个点,那么这两点间必须存在一条颜色为红色的路径,即两点连通于红色)

求连通性很容易想到并查集.将每种颜色看成一个并查集,要求两点之间所有颜色时只需遍历所有颜色,看有多少种颜色能连通即可.



#include <iostream>
using namespace std;
class bingchaji
{
public:
    bingchaji()
    {
        init();
    }
    int father[200];
    void init()
    {
        for(int i=0;i<200;i++)
            father[i]=i;
    }
    void unit(int u,int v)
    {
        father[getfather(u)]=father[getfather(v)];
    }
    int getfather(int v)
    {
       if(father[v]==v)
           return v;
       return father[v]=getfather(father[v]);
    }
    bool same(int u,int v)
    {
        return getfather(u)==getfather(v);
    }
}color[200];

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,c;
        cin>>u>>v>>c;
        color[c].unit(u,v);
    }
    int k;
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        int u,v;
        int res=0;
        cin>>u>>v;
        for(int j=1;j<=m;j++)
        {
            if(color[j].same(u,v))
                res++;
        }
        cout<<res<<endl;
    }
    return 0;
}
时间: 2024-10-19 18:48:49