/*
先来个灌水法 然后建图跑最小生成树
注意观察题目中的规则 a[1][i]!=a[1][j]&&abs(a[2][i]-a[2][j])<=1
建图的时候可以每一个建筑物都看成一个点 然后计算需要几个桥
同一个城市的不用桥
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m,tot,g[][],a[][],minn[],f[],sum,bb;
char s[][];
int xx[]={,,,,,,-,-,-};//枚举8个方向
int yy[]={,,-,-,,,-,,};
void Dfs(int x,int y)
{
s[x][y]=tot+;
int i,j,ox,oy;
for(i=;i<=;i++)//枚举8个方向
{
ox=x+xx[i];oy=y+yy[i];
if(ox>&&ox<=n&&oy>&&oy<=m&&s[ox][oy]=='#')
Dfs(ox,oy);
}
}
int main()
{
cin>>n>>m;
int i,j,k,l;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
cin>>s[i][j];
for(i=;i<=n;i++)
for(j=;j<=m;j++)
if(s[i][j]=='#')//统计城市个数
{
tot++;
Dfs(i,j);
}
cout<<tot<<endl;
memset(g,,sizeof(g));
tot=;//建筑物数量
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
if(s[i][j]!='.')//记录每个建筑物的信息
{
tot++;
a[][tot]=i;//横坐标
a[][tot]=j;//纵坐标
}
}
for(i=;i<=tot;i++)//建图(每个点都建 属于一个城市的不同桥)
for(j=i+;j<=tot;j++)
{
if(a[][i]!=a[][j]&&abs(a[][i]-a[][j])<=)//如果符合连桥的条件
{
g[i][j]=abs(a[][i]-a[][j])-;
g[j][i]=g[i][j];
}
else if(a[][i]!=a[][j]&&abs(a[][i]-a[][j])<=)
{
g[i][j]=abs(a[][i]-a[][j])-;
g[j][i]=g[i][j];
}
}
memset(minn,,sizeof(minn));
minn[]=;
for(i=;i<=tot;i++)//跑 Prim
{
k=;
for(j=;j<=tot;j++)
if(f[j]==&&minn[j]<minn[k])
k=j;
f[k]=;
for(j=;j<=tot;j++)
if(f[j]==&&minn[j]>g[k][j])
minn[j]=g[k][j];
}
for(i=;i<=tot;i++)
{
if(minn[i]!=&&minn[i]<)
{
bb++;//统计桥的个数
sum=sum+minn[i];//累加桥的长度
}
}
cout<<endl<<bb<<" "<<sum;
return ;
}

codevs1002搭桥(建图+Prim)的更多相关文章

  1. codevs1002搭桥(prim)

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

  2. codevs1002 搭桥

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

  3. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  4. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  5. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

  6. UVa 3487 & 蜜汁建图

    题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...

  7. POJ 2226 最小点覆盖(经典建图)

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8881   Accepted: 3300 Desc ...

  8. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  9. 【BZOJ-2879】美食节 最小费用最大流 + 动态建图

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1366  Solved: 737[Submit][Status] ...

随机推荐

  1. Java认证:JavaRunnable线程编写接口代码

    Java认证:JavaRunnable线程编写接口代码.JavaRunnable线程如何才能更好的适应目前的编程环境呢?下面我们就看看如何才能更好的进行相关环境.希望下面的文章对大家有所帮助.Java ...

  2. block 和delegate的用法

    //block 和delegate的用法 设置代理 #import <UIKit/UIKit.h> typedef void (^ASIHeadersBlock)(NSString *my ...

  3. 架设wordpress再vps上的 一些感想总结

    日本vps.樱花系列 配置: 2cpu+1G内存+100G硬盘 系统 第一次我把默认的centos 给换了..原因就是,不会linux.而且我主要用.net  感觉 mono也行.但是linux不会. ...

  4. BZOJ 1483 梦幻布丁

    Description \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2,1\)的四个布丁一共有\ ...

  5. BZOJ 3884 上帝与集合的正确用法

    Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作&quo ...

  6. JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)

    在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法. 代码如下: function ...

  7. js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;

    eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...

  8. Qt入门(15)——使用窗口部件

    下面是如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. class MyWidget : public QWidget { public: MyW ...

  9. 【最短路】FOJ 2243 Daxia like uber

    题目链接: http://acm.fzu.edu.cn/problem.php?pid=2243 题目大意: 给一张N个点M条边的有向图,从s出发,把在x1的人送到y1,在x2的人送到y2用的最短距离 ...

  10. 怎么添加项目到SVN上面

     一.通过SVN客户端向服务器上面添加项目 1.在服务器上面创建一个文件夹,文件夹以项目名称命名. 2.在合适目录下右击后,点击SVN Checkout,将你在服务器上面创建的目录checkout下来 ...