B. Mr. Kitayuta's Colorful Graph
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.
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 — ai, bi (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.
For each query, print the answer in a separate line.
4 5
1 2 1
1 2 2
2 3 1
2 3 3
2 4 3
3
1 2
3 4
1 4
2
1
0
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
1
1
1
1
2
Let's consider 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.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 #include <map> 7 #include <set> 8 #include <stack> 9 #include <queue> 10 #include <string> 11 #include <vector> 12 using namespace std; 13 const double EXP=1e-8; 14 const double PI=acos(-1.0); 15 const int INF=0x7fffffff; 16 const int MS=105; 17 18 int fa[MS][MS]; 19 void init() 20 { 21 for(int i=0;i<MS;i++) 22 for(int j=0;j<MS;j++) 23 fa[i][j]=j; 24 } 25 int find(int c,int a) 26 { 27 if(fa[c][a]==a) 28 return a; 29 return fa[c][a]=find(c,fa[c][a]); 30 } 31 void make_union(int c,int a,int b) 32 { 33 a=find(c,a); 34 b=find(c,b); 35 if(a==b) 36 return ; 37 fa[c][b]=fa[c][a]; 38 } 39 int main() 40 { 41 int n,m,q,a,b,c; 42 init(); 43 cin>>n>>m; 44 for(int i=0;i<m;i++) 45 { 46 cin>>a>>b>>c; 47 make_union(c,a,b); 48 } 49 cin>>q; 50 while(q--) 51 { 52 int ans=0; 53 cin>>a>>b; 54 for(c=1;c<=m;c++) 55 if(find(c,a)==find(c,b)) 56 ans++; 57 cout<<ans<<endl; 58 } 59 return 0; 60 }