最小生成树

每读入一个城市,把他与之前的所有城市做一次link()

link的内容:

1.如果两个城市直接相连,合并他们的集合(并查集)
2.如果两个城市可以搭桥,添加一条边来连接。如果不可以搭桥,什么也不做。

接着循环所有pa[],如果pa[i]==i,那么这是一个city。这样计算city数量

做kruskal,计算桥的数量和桥的总长度

代码:

#include<iostream>
#include<cstdlib>
#include<algorithm>
#define Size 5005
using namespace std; int n,m;
int city[Size][]; int num=;
int dis=,num_city=,num_bridge=; int pa[Size];
void init(){
for(int i=;i<=n*m;i++){pa[i]=i;}
}
int find(int x){
if(x!=pa[x])pa[x]=find(pa[x]);
return pa[x];
}
bool query(int x,int y){
return find(x)==find(y);
}
void un(int x,int y){
if(query(x,y))return;
pa[find(x)]=find(y);
} struct E{
int a,b,w;
}edge[];
int cnt=;
int add(int a,int b,int w){
cnt++;
edge[cnt].a=a;
edge[cnt].b=b;
edge[cnt].w=w;
} void link(int a,int b){
int cx=abs(city[a][]-city[b][]);
int cy=abs(city[a][]-city[b][]); if(cx<=&&cy<=){un(a,b); return;}
if(cx>=&&cy>=)return; if(cx>=)add(a,b,cx-);
else add(a,b,cy-);
} bool ff(E a,E b){
return a.w<b.w;
} void kruskal(){
sort(edge+,edge++cnt,ff); for(int i=;i<=cnt;i++){
int a=edge[i].a,b=edge[i].b;
if(!query(a,b)){
dis+=edge[i].w;
num_bridge++;
un(a,b);
}
}
} int main(){
cin>>n>>m;
init();
char cc;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>cc;
if(cc=='#'){
num++;
city[num][]=i; city[num][]=j;
for(int k=;k<num;k++){
link(k,num);
}
}
}
}
// cout<<num<<endl;
// for(int i=1;i<=cnt;i++){
// cout<<edge[i].a<<' '<<edge[i].b<<' '<<edge[i].w<<endl;
// }
for(int i=;i<=num;i++){
if(pa[i]==i)num_city++;
}
kruskal();
cout<<num_city<<endl<<num_bridge<<' '<<dis<<endl;
}

code1002 搭桥的更多相关文章

  1. codevs 1002 搭桥

    codevs 第一道题 先贴描述 1002 搭桥  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description ...

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

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

  3. 【并查集】【DFS】搭桥

    [codevs1002]搭桥 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着 ...

  4. codevs1002 搭桥

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  5. 【wikioi】1002 搭桥(dfs+最小生成树)

    http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...

  6. codevs1002搭桥(建图+Prim)

    /* 先来个灌水法 然后建图跑最小生成树 注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j])<=1 建图的时候可以每一个建筑物都看 ...

  7. codevs1002搭桥(prim)

    题目描述: 这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树.但是--这个图可能是不连通的--求桥的数量和总长 于是我立刻想到 ...

  8. 【codevs1002】搭桥(prim)

    题目描述: 这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树.但是……这个图可能是不连通的……求桥的数量和总长 于是我立刻想到 ...

  9. 搭桥(codevs 1002)

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

随机推荐

  1. C# window Service实现调用有UI的应用程序(关于win xp以后的window系统)

    我开发的系统中有一接口程序(这里就称Task,是一个C#的Console Application)经常无故的死掉,导致第二天的数据不能正常解析,所以,我写了一个window service去监视Tas ...

  2. jpa-入门级测试

  3. redis详解(二)-- 数据类型详解

    Redis常用数据类型详解 1,Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据 ...

  4. Vue2.0中v-for迭代语法变化(key、index)

    语法发生了变化:http://blog.csdn.net/sinat_35512245/article/details/53966788 新数组语法 value in arr (value, inde ...

  5. 树莓派实现远程下载(apache2+aria2+webui-aria2)

    1.挂载存储设备(可远程设备) 本例是挂载路由器上的移动硬盘,也可以挂载连接在树莓派上的U盘. sudo mount -t cifs -o dir_mode=0777,file_mode=0777   ...

  6. spring cloud: eureka搭建

    1. 添加pom 依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  7. python-最好大学排名

    # -*- coding: utf-8 -*-"""Created on Mon Apr 3 09:37:52 2017 @author: zuihaodaxuepaim ...

  8. edgeR

    1)简介 edgeR作用对象是count文件,rows 代表基因,行代表文库,count代表的是比对到每个基因的reads数目.它主要关注的是差异表达分析,而不是定量基因表达水平. edgeR wor ...

  9. 在Ubuntu上安装微信

    1) 从https://github.com/geeeeeeeeek/electronic-wechat/releases地址中下载linux-x64.tar.gz文件到/opt/wechat文件夹 ...

  10. What is API Level?

    [What is API Level?] 参考:http://android.xsoftlab.net/guide/topics/manifest/uses-sdk-element.html#ApiL ...