code1002 搭桥
最小生成树
每读入一个城市,把他与之前的所有城市做一次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 搭桥的更多相关文章
- codevs 1002 搭桥
codevs 第一道题 先贴描述 1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description ...
- 搭桥|codevs1002|最小生成树|Prim|并查集|Elena
1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
- 【并查集】【DFS】搭桥
[codevs1002]搭桥 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着 ...
- codevs1002 搭桥
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
- 【wikioi】1002 搭桥(dfs+最小生成树)
http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...
- codevs1002搭桥(建图+Prim)
/* 先来个灌水法 然后建图跑最小生成树 注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j])<=1 建图的时候可以每一个建筑物都看 ...
- codevs1002搭桥(prim)
题目描述: 这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树.但是--这个图可能是不连通的--求桥的数量和总长 于是我立刻想到 ...
- 【codevs1002】搭桥(prim)
题目描述: 这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树.但是……这个图可能是不连通的……求桥的数量和总长 于是我立刻想到 ...
- 搭桥(codevs 1002)
题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...
随机推荐
- Ceph实战入门系列(一)——三节点Ceph集群的安装与部署
安装文档:http://blog.csdn.net/u014139942/article/details/53639124
- JS 操作 file标签只上传照片
在当前高版本浏览器里 在标签里加这个属性就够用了 accept="image/*" $('input[type="file"]').live('change', ...
- c++builder 6 远程调试
Delphi7环境 一.目标远程机器: 安装服务光盘里有,单独安装,启动,启动后目标机的托盘图标中会出现一个小“虫子”debug的图标 bordbg61.exe D:\Program Files (x ...
- Flash Builder编译的swf为什么在bin-debug下运行正常,复制到其他文件夹就不正常
在Flash Builder/Flex Builder中,可以使用编译参数-use-network=false实现
- GPU寄存器相关
1,shader model 3.0 只有256个常量寄存器,32个临时寄存器.对应dx9, opengl2.0, opengles2.0 2,shader model 4.0 有65536个寄存器, ...
- linux查看网卡驱动
[root@hudson ~]# yum install ethtool -y [root@hudson ~]# ethtool -i em1driver: bnx2version: 2.2.3fir ...
- Object-c中的单例
#import <UIKit/UIKit.h> @interface UniAudioPlayer:NSObject{ } +(UniAudioPlayer*) getInstance; ...
- Python线程优先级队列(Queue)
Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实 ...
- MS-SQL
变量 一个@为局部变量,两个@@为全局变量 @@error 最后一句SQL语句的错误编号 错误码 @@identity最后一次插入的标示值符 insert into biao(lie) output ...
- javascript 函数对象
http://hi.baidu.com/gdancer/blog/item/a59e2c12479b4e54f919b814.html jQuery的一些写法就是基于这篇文章的原理的.. 函数 ...