现在的位置: 首页 > 综合 > 正文

Codeforces 505B. Mr. Kitayuta’s Colorful Graph 并查集

2017年10月18日 ⁄ 综合 ⁄ 共 2447字 ⁄ 字号 评论关闭

B. Mr. Kitayuta's Colorful Graph
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges.
The vertices of the graph are numbered from 1 to n. Each edge, namely edge i,
has a color ci,
connecting vertex ai and bi.

Mr. Kitayuta wants you to process the following q queries.

In the i-th query, he gives you two integers — ui and vi.

Find the number of the colors that satisfy the following condition: the edges of that color connect vertex ui and
vertex vi directly
or indirectly.

Input

The first line of the input contains space-separated two integers — n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100),
denoting the number of the vertices and the number of the edges, respectively.

The next m lines contain space-separated three integers — aibi (1 ≤ ai < bi ≤ n)
and ci (1 ≤ ci ≤ m).
Note that there can be multiple edges between two vertices. However, there are no multiple edges of the same color between two vertices, that is, if i ≠ j(ai, bi, ci) ≠ (aj, bj, cj).

The next line contains a integer — q (1 ≤ q ≤ 100),
denoting the number of the queries.

Then follows q lines, containing space-separated two integers — ui and vi (1 ≤ ui, vi ≤ n).
It is guaranteed that ui ≠ vi.

Output

For each query, print the answer in a separate line.

Sample test(s)
input
4 5
1 2 1
1 2 2
2 3 1
2 3 3
2 4 3
3
1 2
3 4
1 4
output
2
1
0
input
5 7
1 5 1
2 5 1
3 5 1
4 5 1
1 2 2
2 3 2
3 4 2
5
1 5
5 1
2 5
1 5
1 4
output
1
1
1
1
2
Note

Let's consider the first sample.

The figure above shows the first sample.

  • Vertex 1 and vertex 2 are connected by color 1 and 2.
  • Vertex 3 and vertex 4 are connected by color 3.
  • Vertex 1 and vertex 4 are not connected by any single color.

/* ***********************************************
Author        :CKboss
Created Time  :2015年01月19日 星期一 21时07分56秒
File Name     :CF505B.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int maxn = 200;

int n,m,q;

int fa[maxn][maxn];

void init()
{
	for(int i=0;i<200;i++)
		for(int j=0;j<200;j++)
			fa[i][j]=j;
}

int find(int c,int x)
{
	if(fa[c][x]==x) return x;
	return fa[c][x]=find(c,fa[c][x]);
}

void Union(int c,int a,int b)
{
	a = find(c,a);
	b = find(c,b);

	if(a==b) return ;

	fa[c][a]=fa[c][b];
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);

	scanf("%d%d",&n,&m);
	init();
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		Union(c,a,b);
	}
	scanf("%d",&q);
	while(q--)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		int temp = 0;
		for(int i=1;i<=m;i++)
		{
			int a = find(i,u);
			int b = find(i,v);
			if(a==b) temp++;
		}
		printf("%d\n",temp);
	}
    return 0;
}

抱歉!评论已关闭.