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. bootstrap开发响应式网页的常用的一些 类的说明

    1.navbar-导航条 1.navbar-fixed-top,让导航条固定显示在页面上部(注意:固定的导航条会遮住代码,解决方案,给body设置padding-top的值[大于或等于]为我们导航条的 ...

  2. react项目建立导入包问题总结

    1.react和react-dom包 使用react开发网页的话,我们难免会下载两个包,一个是react,一个是react-dom,其中react是react的核心代码.react的核心思想是虚拟Do ...

  3. 【MySQL】目录、文件权限问题

    详情如下: $ cat /usr/local/mysql/data/Phoenix-slow.log cat: /usr/local/mysql/data/Phoenix-slow.log: Perm ...

  4. "A valid provisioning profile for this executable was not found"问题

    时间:2015年8月14日 初接触iOS,这两天真机调试的时候遇到了这个问题.如图所示: 上网查后发现,解决方法大致有以下两种: 1. provisioning profile没有被找到,需要重新导入 ...

  5. 调试过程中发现按f5无法走进jdk源码

    debug 模式 ,在fis=new FileInputStream(file); 行打断点 调试过程中发现按f5无法走进jdk源码 package com.lzl.spring.test; impo ...

  6. 基于Docker的GitLab搭建

    今天写一些Docker搭建GitLab,好久没有写博客园了,今天又回来了,为了学习技术? 建议使用Linux内核系统,或者虚拟机,首先安装docker环境(菜鸟教程) 一.下载镜像文件 如果慢的话,可 ...

  7. Hadoop 系列(一)—— 分布式文件系统 HDFS

    一.介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错.高吞吐量等特性,可以部署在低成本的硬件上. 二.HDFS 设计原理 ...

  8. 佳木斯集训Day8

    本来能AK的啊啊啊啊啊,唯一一天可以AK,却被Champion误导了(好吧实际上是我理解有问题) T1我写了俩小时,就是一道数列题,推公式的,可以二分解,我觉得二分麻烦,就直接想O(1)了 #incl ...

  9. RBF神经网络

    RBF神经网络 RBF神经网络通常只有三层,即输入层.中间层和输出层.其中中间层主要计算输入x和样本矢量c(记忆样本)之间的欧式距离的Radial Basis Function (RBF)的值,输出层 ...

  10. spark shuffle读操作

    提出问题 1. shuffle过程的数据是如何传输过来的,是按文件来传输,还是只传输该reduce对应在文件中的那部分数据? 2. shuffle读过程是否有溢出操作?是如何处理的? 3. shuff ...