Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph dfs

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 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条边;

     每条边有个颜色,每次u,v只能走一条颜色的路径;

     求有多少条路;

  思路:暴力dfs;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14http://v.ifeng.com/program/lyyy/
const int N=2e5+10,M=1e6+10,inf=1e9+10,MOD=2009;
const ll INF=1e18+10;
struct edge
{
    int v,w;
    int nex;
}edge[N];
int head[N],edg;
void init()
{
    memset(head,-1,sizeof(head));
    edg=0;
}
void add(int u,int v,int w)
{
    ++edg;
    edge[edg].v=v;
    edge[edg].w=w;
    edge[edg].nex=head[u];
    head[u]=edg;
}
int now,to,ans;
int flag[N];
int hh[N];
void dfs(int u,int pre)
{
    //cout<<u<<" "<<pre<<endl;
    if(u==to)
    {
        if(!hh[pre]&&pre!=-1)
        {
            ans++;

            hh[pre]=1;
        }
        return;
    }
    for(int i=head[u];i!=-1;i=edge[i].nex)
    {
        int v=edge[i].v;
        if(flag[v])continue;
        int w=edge[i].w;
        if(pre==-1||w==pre)
        {
            flag[v]=1;
            dfs(v,w);
            flag[v]=0;
        }
    }
}
int main()
{
    init();
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    int q;
    scanf("%d",&q);
    while(q--)
    {
        memset(hh,0,sizeof(hh));
        ans=0;
        scanf("%d%d",&now,&to);
        flag[now]=1;
        dfs(now,-1);
        flag[now]=0;
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jhz033/p/6031555.html