TLE on Subtask#1:#9Record
Code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 31011
using namespace std;
int m,n,cnt,ans,num,fa[101];
struct E{
int to,nxt,w;
}edge[1001];
struct node{
int l,r,cnt;
}e[1001];
int find(int x){
if(x==fa[x])return x;
return find(fa[x]);
}
bool cmp(E a,E b){
return a.w<b.w;
}
void dfs(int x,int now,int k){
if(now==e[x].r+1){
if(k==e[x].cnt)cnt++;
return;
}
int p=find(edge[now].to),q=find(edge[now].nxt);
if(p!=q){
fa[p]=q;
dfs(x,now+1,k+1);
fa[p]=p;
}
dfs(x,now+1,k);
}
int main(){
//freopen("in.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)scanf("%d%d%d",&edge[i].to,&edge[i].nxt,&edge[i].w);
sort(edge+1,edge+m+1,cmp);
int tot=0;
for(int i=1;i<=m;i++){
if(edge[i].w!=edge[i-1].w){
num++;
e[num].l=i,e[num-1].r=i-1;
}
int p=find(edge[i].to),q=find(edge[i].nxt);
if(p!=q){
fa[p]=q;
e[num].cnt++;
tot++;
}
}
if(tot!=n-1){
printf("0");
return 0;
}
e[num].r=m;
ans=1;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=num;i++){
cnt=0;
dfs(i,e[i].l,0);
ans=(ans*cnt)%mod;
for(int j=e[i].l;j<=e[i].r;j++){
int p=find(edge[j].to),q=find(edge[j].nxt);
if(p!=q)fa[p]=q;
}
}
printf("%d",ans);
return 0;
}
(其实是板子来的,可能因为板子说“具有相同权值的边不会超过10条。”