C - Mr. Kitayuta's Colorful Graph CodeForces - 505B

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 — 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.

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最后找路的时候遍历一边数组就能找到有几种颜色了。

代码如下:  

  1. #include<stdio.h>
  2. #include<string.h>
  3. int mp[110][110][110]= {0};
  4. int main()
  5. {
  6.     int n,m;
  7.     scanf("%d%d",&n,&m);
  8.     int a,b,c;
  9.     int i,j,k,l;
  10.     for(i=0; i<m; i++)
  11.     {
  12.         scanf("%d%d%d",&a,&b,&c);
  13.         mp[a][b][c]=1;   //初始化无向图
  14.         mp[b][a][c]=1;
  15.     }
  16.     
  17.     for(i=1; i<=m; i++)   //Floyd 算法
  18.         for(j=1; j<=n; j++)
  19.             for(k=1; k<=n; k++)
  20.                 for(l=1; l<=n; l++)
  21.                 {
  22.                     if(mp[k][j][i]&&mp[j][l][i]) //两条边是同一种颜色可以联通
  23.                     {
  24.                         mp[k][l][i]=1;
  25.                         mp[l][k][i]=1;
  26.                     }
  27.                 }
  28.     int t;
  29.     scanf("%d",&t);
  30.     while((t--))
  31.     {
  32.         int sum=0;
  33.         scanf("%d%d",&a,&b);
  34.         for(i=1; i<=m; i++)   //a点 到b 点的所有相通的颜色和
  35.         {
  36.             sum+=mp[a][b][i];
  37.         }
  38.         printf("%d\n",sum);
  39.     }
  40.     return 0;
  41. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值