传送门:bzoj1016
代码
算一下就好了……
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=102,M=1003;
const int mod=31011;
int n,m,cnt,tot,f[N];
ll ans=1,sum;
struct L{int u,v,c;}t[M];
bool operator <(const L& A,const L& B){return A.c<B.c;}
struct Q{int l,r,c;}a[M];
inline int rd()
{
char ch=getchar();int x=0,f=1;
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline void itia()
{for(int i=1;i<=n;i++) f[i]=i;}
inline int find(int x){return x==f[x]? x:find(f[x]);}
inline void dfs(int x,int now,int k)
{
if(now==a[x].r+1){if(k==a[x].c) sum++;return;}
int p=find(t[now].u),q=find(t[now].v);
if(p!=q){
f[q]=p;
dfs(x,now+1,k+1);
f[q]=q;f[p]=p;
}
dfs(x,now+1,k);
}
int main(){
n=rd();m=rd();
for(int i=1;i<=m;i++) t[i].u=rd(),t[i].v=rd(),t[i].c=rd();
sort(t+1,t+m+1);
itia();
for(int i=1;i<=m;i++){
if(t[i].c!=t[i-1].c){a[++cnt].l=i;a[cnt-1].r=i-1;}
if(tot==n-1) continue;
int q=find(t[i].u),p=find(t[i].v);
if(q!=p){f[q]=p;a[cnt].c++;tot++;}
}
a[cnt].r=m;
if(tot!=n-1){printf("0\n");return 0;}
itia();
for(int i=1;i<=cnt;i++){
sum=0;
dfs(i,a[i].l,0);
ans=ans*sum%mod;
for(int j=a[i].l;j<=a[i].r;j++){
int p=find(t[j].u),q=find(t[j].v);//i->j
if(p!=q) f[p]=q;
}
}
printf("%lld\n",ans);
return 0;
}