题解:AT_abc210_e [ABC210E] Ring MST
题目大意
在一个有
思路
为了使总代价最小我们要选择先使用权值较小的操作。将所有操作按
根据循环群性质,从
同理,如果当前图中已有
每减少一个连通块就要消耗一条边。如果从
C++代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll a,ll b){
if(b)return f(b,a%b);
else return a;
struct E{ll a,b;};
bool c(E x,E y){return x.b<y.b;}
int main(){
ll n,m,s=0;
cin>>n>>m;
vector<E> v(m);
for(int i=0;i<m;i++)cin>>v[i].a>>v[i].b;
sort(v.begin(),v.end(),c);
ll g=n;
for(int i=0;i<m;i++){
ll t=f(g,v[i].a);
if(t<g){
s+=(g-t)*v[i].b;
g=t;
}
if(g==1)break;
}
if(g==1)cout<<s;
else cout<<-1;
return 0;
}