zoukankan      html  css  js  c++  java
  • 贪心+MST——cf1095F

     开始看错求最短路了。。

    但是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;
    }
  • 相关阅读:
    flask 知识积累
    python中下划线
    pipenv知识积累
    shell知识积累
    AttributeError: type object 'testClass' has no attribute 'testMothod'
    python知识积累
    补全爬取的url
    linux 的基本命令
    Python里的拷贝
    关于第一次java课的感想
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10911358.html
Copyright © 2011-2022 走看看