# |
Author |
Problem |
Lang |
Verdict |
Time |
Memory |
Sent |
Judged |
|
62751474 |
Practice:
Zory |
506D
- 37
|
C++14 (GCC 6-32)
|
Accepted
|
1684 ms
|
65764 KB
|
2019-10-17 04:35:37 |
2019-10-17 04:35:37 |
|
#include<bits/stdc++.h>
using namespace std;
namespace mine
{
typedef long long ll;
#define pr pair<int,int>
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define GG(x) if(x) {puts("error");exit(666);}
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
ll qread()
{
ll ans=0,f=1;char c=getchar();
while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
return ans*f;
}
void write(ll num)
{
if(num<0) putchar('-'),num=-num;
if(num>=10) write(num/10);
putchar('0'+num%10);
}
void write1(ll num){write(num);putchar(' ');}
void write2(ll num){write(num);putchar('\n');}
template<typename T> void chmax(T &x,const T y) {x=(x>y?x:y);}
template<typename T> void chmin(T &x,const T y) {x=(x<y?x:y);}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
const int INF=0x3f3f3f3f;
const int MOD=943718401;
int mm(const int x){return x>=MOD?x-MOD:x;}
template<typename T> void add(T &x,const T &y){x=(x+y>=MOD?x+y-MOD:x+y);}
ll qpower(ll x,ll e,int mod=MOD){ll ans=1;GG(e<0)while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
ll invm(ll x){return qpower(x,MOD-2);}
const int N=1e6+10;
typedef unordered_map<int,int>::iterator IT;
unordered_map<int,int> fa[N];//(x,col)=fa
int findfa(int col,int x){return fa[x][col]==x?x:fa[x][col]=findfa(col,fa[x][col]);}
void merg(int x,int y,int col)
{
if(!fa[x].count(col)) fa[x][col]=x;
if(!fa[y].count(col)) fa[y][col]=y;
x=findfa(col,x),y=findfa(col,y);fa[x][col]=y;
}
unordered_map<int,int> ans[N];//记忆化
void main()
{
qread();int m=qread();
while(m--)
{
int x=qread(),y=qread(),col=qread();
merg(x,y,col);
}
int q=qread();
while(q--)
{
int x=qread(),y=qread();if(sz(fa[x])>sz(fa[y]))swap(x,y);
if(ans[x].count(y)) {write2(ans[x][y]);continue;}
int now=0;for(auto t:fa[x]) now+=fa[y].count(t.FR) and findfa(t.FR,x)==findfa(t.FR,y);
write2(ans[x][y]=now);
}
}
};//(ans+MOD)%MOD
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
srand(time(0));
mine::main();
}
Click to see test details