离谱问题求助
查看原帖
离谱问题求助
547908
NightTide楼主2022/6/6 12:31

下面这份代码 90 pts,#10 WA,不知道为什么错,代码输出的貌似是 0

#include<bits/stdc++.h>
#define MAXN 110
#define MAXM 1010
#define MOD 31011
using namespace std;
struct edge{
    int fr, to, w;
};
bool operator < (edge a, edge b){ return a.w < b.w; }
bool operator > (edge a, edge b){ return a.w > b.w; }
edge e[MAXM], disc[MAXN];
int n, m, t, cnt, ans = 1;
int head[MAXN], fa[MAXN];
bool vis[MAXN];
int get_fa(int now){
    if(now == fa[now]) return now;
    return get_fa(fa[now]);
}
int kruskal(){
    int res = 0, tot = 0;
    for(int i = 1; i <= m; i++){
        if(e[i].w != e[i - 1].w){
            disc[t].to = i - 1;
            disc[++t].fr = i;
        }
        if(tot == n - 1) continue;
        int fa_x = get_fa(e[i].fr), fa_y = get_fa(e[i].to);
        if(fa_x == fa_y) continue;
        fa[fa_x] = fa_y;
        tot++; res += e[i].w;
        disc[t].w++;
    }
    disc[t].to = m;
    if(tot == n - 1) return res;
    else return  -1;
}
void dfs(int now, int id, int sum){
    if(now > disc[id].to){
        if(sum == disc[id].w) cnt++;
        return ;
    }
    int fa_x = get_fa(e[now].fr), fa_y = get_fa(e[now].to);
    if(fa_x != fa_y){
        fa[fa_x] = fa_y;
        vis[now] = true;
        dfs(now + 1, id, sum + 1);
        vis[now] = false;
        fa[fa_x] = fa_x;
        fa[fa_y] = fa_y;
    }
    dfs(now + 1, id, sum);
}
int main(){
    // freopen("in.txt","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",&e[i].fr,&e[i].to,&e[i].w);
    sort(e + 1, e + m + 1);
    int res = kruskal();
    if(res == -1){
        printf("0\n");
        exit(0);
    }
    for(int i = 1; i <= n; i++) fa[i] = i;
    for(int i = 1; i <= t; i++){
        cnt = 0; dfs(disc[i].fr, i, 0);
        (ans *= cnt) %= MOD;
        for(int j = disc[i].fr; j <= disc[i].to; j++){
            int fa_x = get_fa(e[j].fr), fa_y = get_fa(e[j].to);
            if(fa_x != fa_y) fa[fa_x] = fa_y;
        }
    }
    printf("%d\n",ans);
    return 0;
}

这份代码 AC 了,它和上面那份代码的区别在于 第 11 行 disc[MAXN] 变成了 disc[MAXM]。实在不知道问题在哪,求教!

#include<bits/stdc++.h>
#define MAXN 110
#define MAXM 1010
#define MOD 31011
using namespace std;
struct edge{
    int fr, to, w;
};
bool operator < (edge a, edge b){ return a.w < b.w; }
bool operator > (edge a, edge b){ return a.w > b.w; }
edge e[MAXM], disc[MAXM];
int n, m, t, cnt, ans = 1;
int head[MAXN], fa[MAXN];
bool vis[MAXN];
int get_fa(int now){
    if(now == fa[now]) return now;
    return get_fa(fa[now]);
}
int kruskal(){
    int res = 0, tot = 0;
    for(int i = 1; i <= m; i++){
        if(e[i].w != e[i - 1].w){
            disc[t].to = i - 1;
            disc[++t].fr = i;
        }
        if(tot == n - 1) continue;
        int fa_x = get_fa(e[i].fr), fa_y = get_fa(e[i].to);
        if(fa_x == fa_y) continue;
        fa[fa_x] = fa_y;
        tot++; res += e[i].w;
        disc[t].w++;
    }
    disc[t].to = m;
    if(tot == n - 1) return res;
    else return  -1;
}
void dfs(int now, int id, int sum){
    if(now > disc[id].to){
        if(sum == disc[id].w) cnt++;
        return ;
    }
    int fa_x = get_fa(e[now].fr), fa_y = get_fa(e[now].to);
    if(fa_x != fa_y){
        fa[fa_x] = fa_y;
        vis[now] = true;
        dfs(now + 1, id, sum + 1);
        vis[now] = false;
        fa[fa_x] = fa_x;
        fa[fa_y] = fa_y;
    }
    dfs(now + 1, id, sum);
}
int main(){
    // freopen("in.txt","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",&e[i].fr,&e[i].to,&e[i].w);
    sort(e + 1, e + m + 1);
    int res = kruskal();
    if(res == -1){
        printf("0\n");
        exit(0);
    }
    for(int i = 1; i <= n; i++) fa[i] = i;
    for(int i = 1; i <= t; i++){
        cnt = 0; dfs(disc[i].fr, i, 0);
        (ans *= cnt) %= MOD;
        for(int j = disc[i].fr; j <= disc[i].to; j++){
            int fa_x = get_fa(e[j].fr), fa_y = get_fa(e[j].to);
            if(fa_x != fa_y) fa[fa_x] = fa_y;
        }
    }
    printf("%d\n",ans);
    return 0;
}
2022/6/6 12:31
加载中...