比赛 2025.10.24 评测结果 AAATTTTTTT
题目名称 编辑题目 最终得分 30
用户昵称 淮淮清子 运行时间 21.005 s
代码语言 C++ 内存使用 25.47 MiB
提交时间 2025-10-24 11:17:16
显示代码纯文本
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

const int MOD = 998244353;

long long inv(long long a, long long mod){
    long long res = 1, b = a, e = mod - 2;
    while(e){
        if(e & 1) res = res * b % mod;
        b = b * b % mod;
        e >>= 1;
    }
    return res;
}

struct node{
    int u, v, w;
};
vector<node> E;
int n, m;

int main(){
	freopen("edit.in", "r", stdin);
	freopen("edit.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    vector<vector<pair<int, int> > > G(n + 1);
    E.reserve(m);
    for(int i = 0;i < m;i ++){
        int u, v, w; cin >> u >> v >> w;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, w);
        E.push_back({u, v, w});
    }
    auto check = [](int u, int v, int u0, int v0){return (u == u0 && v == v0) || (u == v0 && v == u0);};
    int win = 0;
    for(auto e : E){
        int u0 = e.u, v0 = e.v, w0 = e.w;
        vector<bool> fuck(n + 1);
        for(int u = 1;u <= n;u ++){
            for(auto x : G[u]){
            	int v = x.first, w = x.second;
                if(w == w0 && !check(u, v, u0, v0)){
                    fuck[u] = true;
                    break;
                }
            }
        }
        for(int S = 1;S <= n;S ++){
            if(fuck[S]){
                ++ win;
                continue;
            }
            vector<bool> vis(n + 1);
            queue<int> q; q.push(S);
            vis[S] = true;
            bool flag = false;
            while(!q.empty() && !flag){
                int u = q.front(); q.pop();
                for(auto x : G[u]){
					int v = x.first, w = x.second;
                    if(check(u, v, u0, v0)) continue;
                    if(!vis[v]){
                        vis[v] = true;
                        if(fuck[v]){
                            flag = true;
                            break;
                        }
                        q.push(v);
                    }
                }
            }
            if(flag) ++ win;
        }
    }
    long long tot = 1LL * n * m;
    long long ans = 1LL * win * inv(tot, MOD) % MOD;
    cout << ans << '\n';
    return 0;
}