Be hackedTLE on Subtask#1:#9
查看原帖
Be hackedTLE on Subtask#1:#9
483466
_TCR_楼主2024/4/15 19:58

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条。”

2024/4/15 19:58
加载中...