| 比赛 |
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;
}