#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);
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: