Electrification Plan

题意:在一个无向图中,给你几个源点,找出把所有点连接到源点后最小的消费;

可以利用并查集:

  先用结构体把每个边存起来,再按照消费大小排序。之后从消费小的到大的一个个尝试,两个点需要连接的话,连接上同时把消费也算上去;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
const int inf = 0x3f3f3f; using namespace std; int n,k;
int fa[+];
struct node
{
int from,to;
int c;
}a[];
bool cmp(node a,node b)
{
return a.c<b.c;
}
void init(){
for(int i=;i<=n;i++)
fa[i] = i;
}
int find(int x)
{
if(fa[x]==x)return x;
else return fa[x] = find(fa[x]);
}
int uni(int x,int y)
{
if(fa[x]==-&&fa[y]==-)return ; //(**)
int px = find(x);
int py = find(y);
if(px==py)return ;
else
{
fa[px] = py;
return ;
}
} int main(){
scanf("%d%d",&n,&k);
init();
for(int i=;i<=k;i++)
{
int x;
scanf("%d",&x);
fa[x]=-; //这个操作我其实不是很明确,我以我的理解加上了(**)这句,
} //表示源点之间不用连接,但是别人写的好像不用加这句话。
int cnt =;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int cost;
scanf("%d",&cost);
if(cost==)continue;
a[++cnt].c=cost;
a[cnt].from = i;
a[cnt].to =j;
}
}
sort(a+,a++cnt,cmp);
int ans = ;
for(int i=;i<=cnt;i++)
{
if(uni(a[i].from,a[i].to))
{
ans += a[i].c;
}
}
printf("%d\n",ans);
return ;
}

我自己就做了一个预处理,(直接把读入的用uni连接起来

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
const int inf = 0x3f3f3f; using namespace std; int n,k;
int fa[+];
struct node
{
int from,to;
int c;
}a[];
bool cmp(node a,node b)
{
return a.c<b.c;
}
void init(){
for(int i=;i<=n;i++)
fa[i] = i;
}
int find(int x)
{
if(fa[x]==x)return x;
else return fa[x] = find(fa[x]);
}
int uni(int x,int y)
{
int px = find(x);
int py = find(y);
if(px==py)return ;
else
{
fa[px] = py;
return ;
}
} int main(){
scanf("%d%d",&n,&k);
init();
int last=-;
for(int i=;i<=k;i++)
{
int x;
scanf("%d",&x);
if(last!=-)
{
int suibian;
suibian =uni(last,x); //不理解别人把fa[x]=-1的操作;
last = x; //自己就先预处理连接好了;
}
else last=x;
}
int cnt =;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
int cost;
scanf("%d",&cost);
if(cost==)continue;
a[++cnt].c=cost;
a[cnt].from = i;
a[cnt].to =j;
}
}
sort(a+,a++cnt,cmp);
int ans = ;
for(int i=;i<=cnt;i++)
{
if(uni(a[i].from,a[i].to))
{
ans += a[i].c;
}
}
printf("%d\n",ans);
return ;
}

URAL-1982-Electrification Plan最小生成树或并查集的更多相关文章

  1. timus 1982 Electrification Plan(最小生成树)

    Electrification Plan Time limit: 0.5 secondMemory limit: 64 MB Some country has n cities. The govern ...

  2. Timusoj 1982. Electrification Plan

    http://acm.timus.ru/problem.aspx?space=1&num=1982 1982. Electrification Plan Time limit: 0.5 sec ...

  3. Electrification Plan 最小生成树(prim+krusl+堆优化prim)

    题目 题意: 无向图,给n个城市,n*n条边,每条边都有一个权值 代表修路的代价,其中有k个点有发电站,给出这k个点的编号,要每一个城市都连到发电站,问最小的修路代价. 思路: prim:把发电站之间 ...

  4. 搭桥|codevs1002|最小生成树|Prim|并查集|Elena

    1002 搭桥  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...

  5. 线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板

    线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using name ...

  6. URAL 1671 Anansi's Cobweb (并查集)

    题意:给一个无向图.每次查询破坏一条边,每次输出查询后连通图的个数. 思路:并查集.逆向思维,删边变成加边. #include<cstdio> #include<cstring> ...

  7. hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集

    题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值. ...

  8. 2018.11.02 NOIP模拟 飞越行星带(最小生成树/二分+并查集)

    传送门 发现题目要求的就是从下到上的瓶颈路. 画个图出来发现跟去年noipnoipnoip提高组的奶酪差不多. 于是可以二分宽度+并查集检验,或者直接求瓶颈. 代码

  9. URAL-1982 Electrification Plan 最小生成树

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982 题意:无向图,给n个点,n^2条边,每条边有个一权值,其中有k个点有发电站,给出这 ...

随机推荐

  1. MyBatis框架之关联查询

    概述:关联查询主要在<resultMap>元素中,用<association>配置一对一.用<collection> 配置一对多 一.一对一查询       1.使 ...

  2. git的使用(一)

    git   —version  展示git的版本 tanya ~$ git --version git version 2.22.0 最小配置   git config —global user.na ...

  3. 5.Go-封装、继承、接口、多态和断言

    面向对象 Go语言开发者认为:面向对象就是特定类型(结构体)有着自己的方法,利用这个方法完成面向对象编程, 并没有提封装.继承.多态.所以Go语言进行面向对象编程时,重点在于灵活使用方法. Go语言有 ...

  4. css3加js做一个简单的3D行星运转效果

    前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...

  5. 佳木斯集训Day1

    23333第一次写博客 其实在佳木斯集训之前我都已经两三个月没打代码了 在佳木斯的时候前几天真心手生,导致了前几次考试考的很差... D1的考试还是比较良心的,T1是一道大模拟,直接枚举最后几位是00 ...

  6. java-极光推送教程

    一.准备工作: 1.访问极光推送官网:https://www.jiguang.cn/accounts/login/form 2.注册登陆,拿到appKey和masterSecret 3.创建一个应用, ...

  7. spring-boot 示例大全

    spring-boot-demo Spring Boot 学习示例,将持续更新... 本项目基于spring boot 最新版本(2.1.7)实现 什么是spring-boot Spring Boot ...

  8. Go中配置文件读取的几种方式

    日常开发中读取配置文件包含以下几种格式: json 格式字符串 K=V 键值对 xml 文件 yml 格式文件 toml 格式文件 前面两种书写简单,解析过程也比较简单.xml形式书写比较累赘,yml ...

  9. Vue小事例

    login <!DOCTYPE html><html lang="ZH-cn"> <head> <meta charset="U ...

  10. hdu1241 油田计数

    具体思路:求联通块,在"@“的周围进行dfs,使用8个方向向量来代表搜索的方向 贴一下我的主要代码段: int dir[8][2]={{1,1},{-1,-1},{1,-1},{-1,1}, ...