#include bits/stdc++.h using namespace std ; //假设有一百个节点 const int N = 100 ; int find ( vector int p , int x ){ return x == p [ x ] ? p [ x ]: p [ x ] = find ( p , p [ x ]); } int main (){ vector int p ( N , - 1 ); int n , m
#include <bits/stdc++.h>
using namespace std;
//假设有一百个节点
const int N=100;
int find( vector<int>&p,int x){
return x==p[x]?p[x]:p[x]=find(p,p[x]);
}
int main(){
vector<int>p(N,-1);
int n,m,a,b,u,v;
cin>>n>>m>>a>>b;
//节点初始化 ,为自己的索引
for(int i=0;i<n;i++){
p[i]=i;
}
//建立并查集
for(int i=1;i<=m;i++){
cin>>u>>v;
int fu=find(p,u);
int fv=find(p,v);
if(fu!=fv){
p[fu]=fv;
}
}
int cnt=0;
//计算有几个连通量
for(int i=0;i<n;i++){
if(p[i]==i){
cnt++;
}
}
int ans=b+b+(cnt-1)*b+cnt*a;
printf("%d\n",ans);
return 0;
}