#include <stdio.h>
#include <vector>
#include <algorithm>
#define ll long long
#define MOD 998244353
struct Edge {
int from, to;
int idx;
};
bool cmp(Edge A, Edge B) {
if(A.idx!=B.idx) return A.idx>B.idx;
if(A.from!=B.from) return A.from<B.from;
return A.to<B.to;
}
int n, m, p[200010], EdgeCnt=0, ex[200010];
ll res;
int fP(int a) {
if(a==p[a]) return a;
return p[a]=fP(p[a]);
}
void mN(int u, int v) {
u=fP(u);
v=fP(v);
if(u==v) return;
p[v]=u;
}
ll modPow(ll a, int k) {
if(k==0) return 1;
ll res=modPow(a, k/2);
res = (res*res) % MOD;
if(k%2) res = (res*a) % MOD;
return res;
}
int main() {
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++) p[i]=i;
Edge E;
std::vector<Edge> EDGE;
for(int i=1; i<=m; i++) {
scanf("%d %d", &E.from, &E.to);
E.idx=i; //E.cost=modPow(2, i);
EDGE.push_back(E);
ex[i]=1;
}
std::sort(EDGE.begin(), EDGE.end(), cmp);
for(int i=0; i<m; i++) {
if(fP(EDGE[i].to)==fP(EDGE[i].from)) continue;
mN(EDGE[i].from, EDGE[i].to);
ex[EDGE[i].idx]=0; //이미 간선 선택
EdgeCnt++;
if(EdgeCnt==n-2) break; // 최대 비용의 연결요소 2개로 만듦
}
for(int i=0 ;i<m; i++) {
if(!ex[EDGE[i].idx]) continue; // 선택된 간선
if(fP(EDGE[i].to)!=fP(EDGE[i].from)) //부모가 같은 노드 -> 연결
res+=modPow(2, EDGE[i].idx);
}
printf("%lld", res);
}
To embed this project on your website, copy the following code and paste it into your website's HTML: