zoukankan      html  css  js  c++  java
  • P1550 [USACO08OCT]打井Watering Hole

    传送门

    如果没有挖井只是联通所有点就是最小生成树

    但是有挖井,我们需要转换一下

    把挖井操作看成 0 号点连一条边过去

    然后还是最小生成树..

    因为是稠密图,所以用 prim 算法来求最小生成树

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<queue>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=507,INF=0x3f3f3f3f;
    int n,ans,mp[N][N];
    struct data
    {
        int dis,id;
        inline bool operator < (const data &tmp) const {
            return dis>tmp.dis;
        }
    };
    priority_queue <data> q;
    int dis[N];
    bool vis[N];
    void prim(int st)//prim模板
    {
        memset(dis,INF,sizeof(dis));
        q.push((data){0,st}); dis[0]=0;
        while(!q.empty())
        {
            data x=q.top(); q.pop();
            if(vis[x.id]) continue;
            vis[x.id]=1; ans+=x.dis;
            for(int i=0;i<=n;i++)
                if(dis[i]>mp[x.id][i])
                {
                    dis[i]=mp[x.id][i];
                    q.push((data){mp[x.id][i],i});
                }
        }
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++) mp[0][i]=mp[i][0]=read();//0号点连边
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++) mp[i][j]=mp[j][i]=read();
        prim(0);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    构建之法阅读笔记03
    周进度条
    周活动总结表
    电脑桌面美化
    如何让自己进步,去做成一件事
    后台网站
    laravel RBAC权限管理学习
    laravle定时任务
    django第一次简单讲解使用
    css3网页的淡入淡出效果
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/9854655.html
Copyright © 2011-2022 走看看