B. Mr. Kitayuta's Colorful Graph (CF #286 (Div. 2) 并查集)

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.

题意:现有n个点m条边的无向图,每条边都有一种颜色,然后有q次询问,x y询问点x到点y共有几种颜色的边将他们连起来(不同颜色的边不能混在一起,要分开看)

思路:二维并查集,每种颜色维护一个并查集,查询时看某一种颜色下两个点是否有共同的father。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 1005
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef long long ll;
using namespace std;

int n,m;
int color[110];
int father[110][110];

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

int find_father(int c,int x)        //递归写法
{
    if (x!=father[c][x])
        father[c][x]=find_father(c,father[c][x]);
    return father[c][x];
}

//int find_father(int c,int x)  //非递归写法
//{
//    int r=x,i,j;
//    while(r!=father[c][r])
//        r=father[c][r];
//    i=x;
//    while(i!=r)
//    {
//        j=father[c][i];
//        father[c][i]=r;
//        i=j;
//    }
//    return r;
//}

int main()
{
    while (~scanf("%d%d",&n,&m))
    {
        init();
        int a,b,c;
        memset(color,0,sizeof(color));  //记录下用了哪些颜色
        for (int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            color[c]=1;
//            printf("+++\n");
            int fa=find_father(c,a);
            int fb=find_father(c,b);
            if (fa!=fb)
                father[c][fa]=fb;
        }
        int q,x,y;
        scanf("%d",&q);
        while (q--)
        {
            scanf("%d%d",&x,&y);
            int ans=0;
            for (int i=1;i<=m;i++)
            {
                if (color[i])
                {
                    if (find_father(i,x)==find_father(i,y))
                        ans++;
                }
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}

B. Mr. Kitayuta's Colorful Graph (CF #286 (Div. 2) 并查集)

时间: 2024-10-06 16:58:01

B. Mr. Kitayuta's Colorful Graph (CF #286 (Div. 2) 并查集)的相关文章

Codeforces Round #286 div.1 D 506D D. Mr. Kitayuta&#39;s Colorful Graph【并查集】

题目链接:http://codeforces.com/problemset/problem/506/D 题目大意: 给出n个顶点,m条边,每条边上有一个数字,代表某个颜色.不同数字代表不同的颜色.有很多个询问,每个询问问有多少条纯种颜色的路径使得某两个点联通. 分析: 这个题一看就想用并查集来搞,每种颜色用一个并查集处理.对于输入的每条边,我们只需要将这两个点在这条边的颜色对应的并查集中合并就好了.查询的时候,我们只需要检测这两个点在多少个颜色对应的并查集中是在统一集合中的,那么就有多少条纯种颜

CF 505B Mr. Kitayuta&#39;s Colorful Graph(最短路)

题意  求两点之间有多少不同颜色的路径 范围比较小  可以直接floyd #include<cstdio> #include<cstring> using namespace std; const int N = 105; int d[N][N][N], ans; int main() { int a, b, c, n, m, q; while(~scanf("%d%d", &n, &m)) { memset(d, 0, sizeof(d));

Codeforces Round #286 (Div. 2)B. Mr. Kitayuta&#39;s Colorful Graph(dfs,暴力)

数据规模小,所以就暴力枚举每一种颜色的边就行了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm>

Codeforces Round #286 (Div. 2) B. Mr. Kitayuta&#39;s Colorful Graph +foyd算法的应用

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 g

DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta&#39;s Colorful Graph

题目传送门 1 /* 2 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 3 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 4 注意:无向图 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 #include <string> 11 #include <vector> 1

Codeforces Round #286 (Div. 1) D. Mr. Kitayuta&#39;s Colorful Graph

D - Mr. Kitayuta's Colorful Graph 思路:我是暴力搞过去没有将答案离线,感觉将答案的离线的方法很巧妙.. 对于一个不大于sqrt(n) 的块,我们n^2暴力枚举, 对于大于sqrt(n)的块,我们暴力枚举答案. 这样就能做到严格sqrt(n) * n #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #defin

CodeForces 505B Mr. Kitayuta&#39;s Colorful Graph

Mr. Kitayuta's Colorful Graph Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 505B Description Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The

codeforces 505B Mr. Kitayuta&#39;s Colorful Graph(水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 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

Codeforces 506D Mr. Kitayuta&#39;s Colorful Graph 并查集+水水的分类讨论+水水的离线预处理

首先读入所有的边与询问.将边按颜色分类. 按颜色进行并查集, 若此并查集内的点<= 100,则100*100/2的枚举是否联通. 若此并查集内的点  > 100,则将与这些点相关的所有询问查一遍. 那么时间复杂度为100*100/2*(M/100),或者为M/100*Q. 极限的时候两种方法都在一亿左右了,而且每次还需要在map里搞一搞,还要查询是否联通,不知道为啥没有超时.. #include <algorithm> #include <iostream> #incl