开始看错求最短路了。。
但是MST的思路和最短路也差不多
就是先不考虑特殊边,用最小点做一个生成树
然后加入特殊边,进行一次krus即可
#include<bits/stdc++.h> #include<queue> using namespace std; #define maxn 400005 #define ll long long ll s,ans,n,m,a[maxn],Min,tot; struct Edge{ll x,y,w;}e[maxn<<1]; int cmp(Edge a,Edge b){return a.w<b.w;} int F[maxn]; int find(int x){return F[x]==x?x:F[x]=find(F[x]);} void add(ll u,ll v,ll w){ e[++tot].x=u;e[tot].y=v;e[tot].w=w; } void krus(){ sort(e+1,e+1+m,cmp); for(int i=1;i<=m;i++){ int f1=find(e[i].x),f2=find(e[i].y); if(f1!=f2){ F[f1]=f2; ans+=e[i].w; } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++)F[i]=i; Min=0x3f3f3f3f3f3f3f3f; for(int i=1;i<=n;i++){//找最小的点 scanf("%lld",&a[i]); if(a[i]<Min){ Min=a[i]; s=i; } } for(int i=1;i<=n;i++) if(i!=s) add(s,i,Min+a[i]); for(int i=1;i<=m;i++){ ll x,y,z; scanf("%lld%lld%lld",&x,&y,&z); add(x,y,z); } m+=tot;//边的规模 krus(); cout<<ans<<endl; }