URAL-1982-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最小生成树或并查集的更多相关文章
- timus 1982 Electrification Plan(最小生成树)
Electrification Plan Time limit: 0.5 secondMemory limit: 64 MB Some country has n cities. The govern ...
- Timusoj 1982. Electrification Plan
http://acm.timus.ru/problem.aspx?space=1&num=1982 1982. Electrification Plan Time limit: 0.5 sec ...
- Electrification Plan 最小生成树(prim+krusl+堆优化prim)
题目 题意: 无向图,给n个城市,n*n条边,每条边都有一个权值 代表修路的代价,其中有k个点有发电站,给出这k个点的编号,要每一个城市都连到发电站,问最小的修路代价. 思路: prim:把发电站之间 ...
- 搭桥|codevs1002|最小生成树|Prim|并查集|Elena
1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
- 线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板
线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using name ...
- URAL 1671 Anansi's Cobweb (并查集)
题意:给一个无向图.每次查询破坏一条边,每次输出查询后连通图的个数. 思路:并查集.逆向思维,删边变成加边. #include<cstdio> #include<cstring> ...
- hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集
题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值. ...
- 2018.11.02 NOIP模拟 飞越行星带(最小生成树/二分+并查集)
传送门 发现题目要求的就是从下到上的瓶颈路. 画个图出来发现跟去年noipnoipnoip提高组的奶酪差不多. 于是可以二分宽度+并查集检验,或者直接求瓶颈. 代码
- URAL-1982 Electrification Plan 最小生成树
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982 题意:无向图,给n个点,n^2条边,每条边有个一权值,其中有k个点有发电站,给出这 ...
随机推荐
- 【pip】brew install pip 问题
Mac 下用 brew install pip 命令安装 pip 时报错: Error: No available formula with the name "pip" Home ...
- 【iOS】打印方法名
为了便于追踪程序运行过程,可以在日志打印方法名,示例代码如下: NSLog(@"%@", NSStringFromSelector(_cmd)); 结果如图所示: 此外,在多个中, ...
- 【iOS】更新 CocoaPods 后 Podfile 报错
更新了 CocoaPods 后,再执行 "pod install" 时报了如下错误: [!] The dependency `AFOnoResponseSerializer` is ...
- 【iOS】代码片段库
若在某个 Objective-C 的实现文件中输入 init,Xcode 会自动列出一系列备选项,如图所示: Xcode 自动加入的这段代码源自代码片段库(code snippet library), ...
- 【iOS】创建真机调试证书
今天第一次完整的在一个开发者账号里添加证书,刚接触,还真有些不熟悉,还好找到了一篇不错的文章:iOS开发:创建真机调试证书 ,做了很详细的介绍. 分享一下!!
- 二进制文件安装安装flannel
二进制文件安装安装flannel overlay网络简介 覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题. 详细说来,覆盖网络是指建立在另一个网络上的网络.该网络中的结 ...
- Hadoop 系列(八)—— 基于 ZooKeeper 搭建 Hadoop 高可用集群
一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求 ...
- ABP实现EF执行SQL(增删改查)解决方案
前言 一般情况下,使用EF中的语法可以帮助我们完成绝大部分业务,但是也有特殊的情况需要直接执行的Sql语句.比如,我们的业务过于复杂繁琐,或是有些业务使用EF操作时比较复杂,但是使用的Sql时会很简单 ...
- Docker部署网站之后映射域名
Docker中部署tomcat相信大家也都知道,不知道的可以google 或者bing 一下.这里主要是为了记录在我们启动容器之后,tomcat需要直接定位到网站信息,而不是打开域名之后,还得加个bl ...
- 【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】
思路 题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大. 思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博 ...