1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define per(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; const int N=200005; int n,m,q; int num[N]; vector<pair<int,int> > e[N],qs; map<pair<int,int>,int> ans,lst; int f[N],sz[N],qto[N]; int find(int i) {return f[i]==i?i:f[i]=find(f[i]);} void merge(int u,int v) { u=find(u);v=find(v); if(u!=v) { if(sz[u]>sz[v]) { f[v]=u; sz[u]+=sz[v]; } else { f[u]=v; sz[v]+=sz[u]; } } } void bao1(int co) { rep(i,1,n) f[i]=i,sz[i]=1; for(vector<pair<int,int> >::iterator ii=e[co].begin();ii!=e[co].end();++ii) { merge(ii->first,ii->second); } for(vector<pair<int,int> >::iterator ii=qs.begin();ii!=qs.end();++ii) { int u=ii->first,v=ii->second; u=find(u),v=find(v); if(u==v) { ++ans[make_pair(ii->first,ii->second)]; } } } void bao2(int co) { int ps[N],tot=0; for(vector<pair<int,int> >::iterator ii=e[co].begin();ii!=e[co].end();++ii) { ps[++tot]=ii->first; ps[++tot]=ii->second; } sort(ps+1,ps+tot+1); tot=unique(ps+1,ps+tot+1)-ps-1; rep(i,1,tot) f[ps[i]]=ps[i],sz[ps[i]]=1; for(vector<pair<int,int> >::iterator ii=e[co].begin();ii!=e[co].end();++ii) { merge(ii->first,ii->second); } rep(i,1,tot) { rep(j,i+1,tot) { bool flg=0; int u=find(ps[i]),v=find(ps[j]); if(u==v) flg=1; if(flg&&ans.count(make_pair(ps[i],ps[j]))) { ans[make_pair(ps[i],ps[j])]++; } } } } int main(){ scanf("%d%d",&n,&m); rep(i,1,m) { int u,v,c; scanf("%d%d%d",&u,&v,&c); num[c]++;e[c].push_back(make_pair(min(u,v),max(u,v))); } scanf("%d",&q); int now=0; rep(i,1,q) { int u,v; scanf("%d%d",&u,&v); if(!ans.count(make_pair(min(u,v),max(u,v)))) { qs.push_back(make_pair(min(u,v),max(u,v))); ++now; lst[make_pair(min(u,v),max(u,v))]=now; qto[i]=now; } else qto[i]=lst[make_pair(min(u,v),max(u,v))]; ans[make_pair(min(u,v),max(u,v))]=0; } rep(i,1,m) { if(num[i]) { if(num[i]>=sqrt(m)) { bao1(i); } else bao2(i); } } rep(i,1,q) { int u=qs[qto[i]-1].first,v=qs[qto[i]-1].second; printf("%d\n",ans[make_pair(u,v)]); } return 0; }
|