首页 > 其他分享 >AcWing. 1146 新的开始

AcWing. 1146 新的开始

时间:2022-12-26 18:55:05浏览次数:66  
标签:1146 int 开始 边权 qquad 通电 include 点权 AcWing

传送门

题目大意

\(\qquad\)给一张图,每个点有对应的点权,每条边有对应的边权。可以有如下几种选择:

\(\qquad\quad\)\(1.\)选择一个没通电的点,花费\(v_i\)。
\(\qquad\quad\)\(2.\)将两个点连边(要有一点通电),边权\(p_{i,j}\)
\(\qquad\)经过上述操作之后,要使全图通电

解题思路

\(\qquad\)一眼看上去有一些麻烦,原因是有点权的存在,导致了这个问题求解需要从点和边两方面去考虑,而且还有“通电”这一限制,所以就导致这题看起来很困难。

\(\qquad\)那我们就可以换一个角度思考,能否将点权转化为边权呢?联系之前求解最短路用的虚拟源点,我们可以把所有点向超级源点\(S\)连一条边,权值是它的点权\(v_i\),这样我们选择点变成了选择边,这样我们再来看通电这一个限制如何解决。

\(\qquad\)当我们假定\(S\)源点是通电的(这样操作\(1\)才能进行),它连向的点就是新开的矿井,这样操作\(1\)相当于两个点通电->不通电的连线,边权是\(v_i\)。

\(\qquad\)由于一开始这张图上的所有点都是不通电的,所以操作\(1\)至少操作\(1\)次,在经历了\(1\)次操作\(1\)之后,这张图上要通电,就是将其它点和已经通电的点连接,当已经通电的点只有\(1\)个时,剩下的点中选出一个,要么和\(S\)连边(操作\(1\)),要么和这个通电的点连边,所以我们这个包含了\(S\)的图通电之后,必定是连通的,那最小费用就是这张图中的最小生成树,用\(Kruskal\)算法跑就行了。

关于建图

\(\qquad\)这题的建图无非两种
\(\qquad\)一开始读入点权的时候顺便把点和\(S\)连边,后面读入边权正常连边就行,对于\(p_{i,j}\),连一条\(i <- >j\)的无向边,边权为\(p_{i,j}\)。用一个变量\(ecnt\)统计边数即可(当然,也可以使用vector

代码

普通

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 310, M = N * (N + 1);
int p[M], n, S, ecnt;

struct Edge 
{
    int u, v, w;
    bool operator <(const Edge& W) const {
        return w < W.w;
    }
} edge[M];

int find(int x) 
{
    if (x != p[x]) p[x] = find(p[x]);
    return p[x];
}

int main() 
{
    scanf("%d", &n);
    
    for (int i = 1; i <= n; i ++ ) 
    {
        int x;
        scanf("%d", &x);
        edge[++ ecnt] = {0, i, x};
    }
    
    for (int i = 1; i <= n; i ++ ) 
        for (int j = 1; j <= n; j ++ ) 
        {
            int x; scanf("%d", &x);
            edge[++ ecnt] = {i, j, x};
        }
    
    sort(edge + 1, edge + ecnt + 1);
    for (int i = 1; i <= ecnt; i ++ ) p[i] = i;
    
    int res = 0;
    for (int i = 1; i <= ecnt; i ++ ) 
    {
        int fu = find(edge[i].u), fv = find(edge[i].v);
        if (fu == fv) continue ;
        
        p[fu] = fv, res += edge[i].w;
    }
    printf("%d\n", res);
    
    return 0;
}

vector

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 310, M = N * (N + 1);
int p[M], n, S, ecnt;

struct Edge 
{
    int u, v, w;
    bool operator <(const Edge& W) const {
        return w < W.w;
    }
} ; vector<Edge> edge;

int find(int x) 
{
    if (x != p[x]) p[x] = find(p[x]);
    return p[x];
}

int main() 
{
    scanf("%d", &n);
    
    for (int i = 1; i <= n; i ++ ) 
    {
        int x;
        scanf("%d", &x);
        edge.push_back({S, i, x});
    }
    
    for (int i = 1; i <= n; i ++ ) 
        for (int j = 1; j <= n; j ++ ) 
        {
            int x; scanf("%d", &x);
            edge.push_back({i, j, x});
        }
    ecnt = edge.size();
    
    sort(edge.begin(), edge.end());
    for (int i = 0; i <= ecnt; i ++ ) p[i] = i;
    
    int res = 0;
    for (int i = 0; i < ecnt; i ++ ) 
    {
        int fu = find(edge[i].u), fv = find(edge[i].v);
        if (fu == fv) continue ;
        
        p[fu] = fv, res += edge[i].w;
    }
    printf("%d\n", res);
    
    return 0;
}

标签:1146,int,开始,边权,qquad,通电,include,点权,AcWing
From: https://www.cnblogs.com/StkOvflow/p/17006405.html

相关文章

  • AcWing1144. 连接格点
    传送门题目描述有一个\(m\)行\(n\)列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花......
  • Blazor Server 从头开始:02 创建组件
    ......
  • AcWing1143. 联络员
    传送门题目大意\(\qquad\)给定一张无向图,其中无向图的边有两种类型:\(\qquad\)\(\qquad\)\(1.\)这类边是必须选择的。\(\qquad\)\(\qquad\)\(2.\)这类边是不必须选择的......
  • Blazor Server 从头开始:01 创建项目
    最近手痒,正好阳性在家,就打算把代码再捡起来看看,学习下这些年来都有什么新东西出现。就看到了微软出的.Net7Blazor相关的内容。走了一遍微软官方的教程,发现用处不大,(可能......
  • AcWing244.谜一样的牛
    传送门题目描述有\(n\)头奶牛,已知它们的身高为\(1\simn\)且各不相同,但不知道每头奶牛的具体身高。现在这\(n\)头奶牛站成一列,已知第\(i\)头牛前面有\(A_i\)......
  • AcWing291.蒙德里安的梦想题解
    题解:蒙德里安的梦想注:本题解内容简陋,多有不周,敬请谅解。如果有问题请在评论区留言。谢谢。由于作者能力有限,这篇题解不会给出太严谨的证明,只是旨在帮助大家更好地理解此......
  • 这是一个开始
    一直以来都非常希望能有一个自己的博客,写博客不仅记录自己的学习经验,同时也是对自己的提升,是技术积累的优秀实践之一。​ 我在很早就开始写博客了,但是种种原因的限制放弃......
  • AcWing83场周赛题解
    第一题、奇偶题目链接:https://www.acwing.com/activity/content/problem/content/7862/比较麻烦(本人做法)找出不同字符个数,再判断。#include<iostream>usingnamespac......
  • AcWing1141. 局域网
    传送门题目大意\(\qquad\)给定一张无向图,没有重边和自环,要删去一些边但是仍然要保证图的连通性,求这些边边权总和的最大值。解题思路\(\qquad\)我们不一定要真的去统计......
  • AcWing.7 混合背包问题
    题目描述有\(N\)种物品和一个容量是\(V\)的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用\(s_i\)次(多......