luogu_1550题解打井(最小生成树)

Posted chriskkk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu_1550题解打井(最小生成树)相关的知识,希望对你有一定的参考价值。

题目:https://www.luogu.org/problemnew/show/P1550

设第n+1号点是水源点。

则题目变为求1到n+1的最小生成树。

w1 到 wn 就为 1 到 n 与 n+1 的连边。

后面的矩阵就是各自的连边。

代码如下:

#include<bits/stdc++.h>
#define sc(x) scanf("%d",&x)
using namespace std;
int n,ans,cnt=1;
struct edge
    int from,to,dis;
    bool operator < (const edge &a) const
        return dis>a.dis;
    
e[400<<1];
priority_queue<edge> q;
int fa[400],head[400];
inline int find(int x)
    if(fa[x]==x) return fa[x];
    else return fa[x]=find(fa[x]);

int main()

    sc(n);
    for(int i=1;i<=n;i++)
        int w;sc(w);
        q.push((edge)i,n+1,w);
        q.push((edge)n+1,i,w);
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        
            int w;sc(w);
            q.push((edge)i,j,w);
        
    for(int i=1;i<=n+1;i++) fa[i]=i;
    while(cnt<n+1)
        edge e=q.top();
        q.pop();
        if(find(e.from)==find(e.to)) continue;
        else
            fa[find(e.from)]=find(e.to);
            cnt++;
            ans+=(e.dis);
        
    
    cout<<ans<<endl;
    system("pause");
    return 0;

 

以上是关于luogu_1550题解打井(最小生成树)的主要内容,如果未能解决你的问题,请参考以下文章

P1550打井

P1550 [USACO08OCT]打井Watering Hole

luogu P1550 [USACO08OCT]打井Watering Hole

题解Luogu P2573 [SCOI2012] 滑雪 最小生成树

题解 P1550 [USACO08OCT]打井Watering Hole

luogu题解P2502[HAOI2006]旅行--最小生成树变式