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
| #include <cstdlib> #include <iostream> #include <algorithm> #define LL long long #define N 101 #define M 1001 #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<(n);i++) using namespace std; struct MP{ int a,b,c; }D[M]; inline bool operator<(const MP a,const MP b) { return a.c<b.c; } int F[N],F1[N],F2[N]; int find(int F[],int a){ while(F[a]!=F[F[a]])F[a]=F[F[a]]; return F[a]; } void link(int F[],int a,int b){ F[find(F,b)]=find(F,a); } int main(int argc,char *argv[]) { ios_base::sync_with_stdio(false); int t,n,m,k; cin>>t; while(t--){ cin>>n>>m>>k; F(N)F[i]=F2[i]=i; F(m)cin>>D[i].a>>D[i].b>>D[i].c; sort(D,D+m); int l=0,en; LL ans=1; F(m){ Fi(j,N)F1[j]=F[j]=F2[j]; en=0; while(i<m&&D[i].c==D[l].c){ if(find(F,D[i].a)!=find(F,D[i].b)){ link(F,D[i].a,D[i].b); en++; n--; } i++; } int p=0; int TT=(1<<(i-l)); Fi(j,N)F2[j]=F[j]; Fi(j,TT){ Fi(h,N)F[h]=F1[h]; int tmp; while(j<TT){ tmp=0; Fi(h,i-l){ if(j&(1<<h))tmp++; } if(tmp==en)break; j++; } if(j>=TT)break; tmp=0; Fl(h,l,i){ if((j&(1<<(h-l)))&&find(F,D[h].a)!=find(F,D[h].b)){ link(F,D[h].a,D[h].b); tmp++; } } if(tmp==en)p++; } ans*=(LL)p; ans%=(LL)k; l=i--; } if(n==1)cout<<ans<<endl; else cout<<"-1\n"; } return 0; }
|