CodeForces

来源:互联网 发布:nginx lua 写入txt 编辑:程序博客网 时间:2024/06/05 14:45
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.

Examples
input
4 51 2 11 2 22 3 12 3 32 4 331 23 41 4
output
210
input
5 71 5 12 5 13 5 14 5 11 2 22 3 23 4 251 55 12 51 51 4
output
11112
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到n。   对于每条边有颜色ci,  连接着顶点 ai 和   b i.

下面有q个询问.

每条询问有两个整数 — ui 和 vi.

找到满足下面条件的颜色个数: 同一种颜色的路径连接顶点 ui 和 顶点 v

Input

第一行是两个整数 — n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100), 代表着定点个数和边的个数

接下来m行有三个整数 — aibi (1 ≤ ai < bi ≤ n) and ci (1 ≤ ci ≤ m). 

下一行有一个整数 — q (1 ≤ q ≤ 100), 代表询问次数

接下来q行,每行两个整数 — ui 和 vi (1 ≤ ui, vi ≤ n). 默认 ui ≠ vi.

Output

对于每次询问,在单独的一行输出答案

一个无向图包含n个点m条边,顶点编号从1到n。   对于每条边有颜色ci,  连接着顶点 ai 和   b i.

下面有q个询问.

每条询问有两个整数 — ui 和 vi.

找到满足下面条件的颜色个数: 同一种颜色的路径连接顶点 ui 和 顶点 v

Input

第一行是两个整数 — n and m (2 ≤ n ≤ 100, 1 ≤ m ≤ 100), 代表着定点个数和边的个数

接下来m行有三个整数 — aibi (1 ≤ ai < bi ≤ n) and ci (1 ≤ ci ≤ m). 

下一行有一个整数 — q (1 ≤ q ≤ 100), 代表询问次数

接下来q行,每行两个整数 — ui 和 vi (1 ≤ ui, vi ≤ n). 默认 ui ≠ vi.

输出:每个询问输出一行。
思路:1.可以看到本题的数据是非常小的 才 100 可以考虑用三维数组去存一下边,然后深搜,例如在这里开一个a[x][y][z]
的数组,z这一维表示颜色,然后就用搜索就可以了。
2.用一个二维并查集fa[x][y],x这一维表示颜色。
//搜索#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#define N 105using namespace std;int map[N][N][N];int n,m;int vis[N];void dfs(int i,int st){vis[st]=1;for(int j=1;j<=n;j++){if(map[st][j][i]==1&&!vis[j]){dfs(i,j);}}return ;}int main(){int i,j,a,b,c,t;while(scanf("%d %d",&n,&m)!=EOF){memset(vis,0,sizeof(vis));memset(map,0,sizeof(map));for(i=1;i<=m;i++){scanf("%d %d %d",&a,&b,&c);map[a][b][c]=map[b][a][c]=1;}scanf("%d",&t);int f;while(t--){f=0;memset(vis,0,sizeof(vis));scanf("%d %d",&a,&b);for(i=1;i<=m;i++){dfs(i,a);if(vis[b]) f++;memset(vis,0,sizeof(vis));}printf("%d\n",f);}}return 0;}

//并查集#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#define N 105using namespace std;int f[N][N];int n,m;void init(){for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){f[i][j]=j;}}return ;}int getf(int i,int x){if(f[i][x]==x) return x;else return f[i][x]=getf(i,f[i][x]);}void merge(int i,int x,int y){int t1=getf(i,x);int t2=getf(i,y);if(t1!=t2){f[i][t2]=t1;return ;}return ;}int main(){int i;int a,b,c;while(scanf("%d %d",&n,&m)!=EOF){init();for(i=1;i<=m;i++){scanf("%d %d %d",&a,&b,&c);merge(c,a,b);}int t,f;scanf("%d",&t);while(t--){f=0;scanf("%d %d",&a,&b);for(int j=1;j<=m;j++){if(getf(j,a)==getf(j,b)){f++;}}printf("%d\n",f);}}return 0;}


原创粉丝点击