Mr. Kitayuta has just bought an undirected graph consisting of n vertices and medges. 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 — 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.
Output
For each query, print the answer in a separate line.
Examples
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.
题目意思:从一个N个点M条边的图,每条边有不同的颜色,前几行输入就是每条边以及对应的颜色
之后一行两个数字的是问从一个点到另一个点有几种颜色可以走到;
后面这个图是说
从1 到 2有1 和2 两种颜色
从3到4有 3一种颜色
从1 到4 没有颜色可以走到
解题思路:开一个三维数组,就是用 Floyd算法把所有的可能遍历一遍如果能走通把数组相应的变成 1最后找路的时候遍历一边数组就能找到有几种颜色了。
代码如下:
- #include<stdio.h>
- #include<string.h>
- int mp[110][110][110]= {0};
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- int a,b,c;
- int i,j,k,l;
- for(i=0; i<m; i++)
- {
- scanf("%d%d%d",&a,&b,&c);
- mp[a][b][c]=1; //初始化无向图
- mp[b][a][c]=1;
- }
- for(i=1; i<=m; i++) //Floyd 算法
- for(j=1; j<=n; j++)
- for(k=1; k<=n; k++)
- for(l=1; l<=n; l++)
- {
- if(mp[k][j][i]&&mp[j][l][i]) //两条边是同一种颜色可以联通
- {
- mp[k][l][i]=1;
- mp[l][k][i]=1;
- }
- }
- int t;
- scanf("%d",&t);
- while((t--))
- {
- int sum=0;
- scanf("%d%d",&a,&b);
- for(i=1; i<=m; i++) //a点 到b 点的所有相通的颜色和
- {
- sum+=mp[a][b][i];
- }
- printf("%d\n",sum);
- }
- return 0;
- }