AcWing. 1146 新的开始
题目大意
解题思路
将点权转化为边权呢?
联系之前求解最短路用的虚拟源点,我们可以把所有点向超级源点通电
这一个限制如何解决。
通电->不通电
的连线,边权是
连通的
,那最小费用就是这张图中的最小生成树,用
关于建图
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)