下面这份代码 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;
}