标签:
给定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;
}
标签:
原文地址:http://www.cnblogs.com/wzsblogs/p/4288760.html