意甲冠军:这个问题刚开始的问题,有错误的含义,原桥始建于一条直线。无论多么遥远。

思维:dfs寻求答案的第一个问题。然后做最小生成树,双方不能大桥将设置INF即可了。然后假设用到INF的边就加上0即可了。这样跑一遍最小生成树就是答案。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 55
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,m,cnt,vis[maxn][maxn],mm[maxn][maxn],sum;
int a[1000005],b[1000005],tmp,sum2,sum3;
char s[maxn][maxn];
int dist[8][2]= {1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1,-1};
int f[1000005];
void dfs(int x,int y,int ans)
{
for(int i=0; i<8; i++)
{
int xx=x+dist[i][0],yy=y+dist[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[xx][yy]&&s[xx][yy]=='#')
{
vis[xx][yy]=1;
f[mm[xx][yy]]=f[ans];
dfs(xx,yy,ans);
}
}
}
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
struct abc
{
int u,v,w;
bool operator<(const abc &a)const
{
return w<a.w;
}
} e[1000005];
void kruscal()
{
sort(e,e+tmp);
int sum=1;
for(int i=0; i<tmp&&sum!=cnt; i++)
{
int x=find(e[i].u),y=find(e[i].v);
if(x!=y)
{
sum++;
sum3+=(e[i].w==INF?0:e[i].w);
sum2++;
f[x]=y;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
scanf("%s",s[i]);
mem(vis,0);
cnt=tmp=0;
mem(f,0);
mem(mm,0);
int sum1=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(s[i][j]=='#')
{
mm[i][j]=++cnt;
a[cnt]=i,b[cnt]=j;
f[cnt]=cnt;
}
for(int i=1; i<=cnt; i++)
for(int j=i+1; j<=cnt; j++)
{
e[tmp].u=i,e[tmp].v=j;
if(abs(a[i]-a[j])<=1&&abs(b[i]-b[j])<=1)
e[tmp++].w=0;
else if(abs(a[i]-a[j])<=1)
e[tmp++].w=abs(b[i]-b[j])-1;
else if(abs(b[i]-b[j])<=1)
e[tmp++].w=abs(a[i]-a[j])-1;
else e[tmp++].w=INF;
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(s[i][j]=='#'&&!vis[i][j])
{
vis[i][j]=1;
dfs(i,j,mm[i][j]);
sum1++;
}
kruscal();
printf("%d\n%d %d\n",sum1,sum2,sum3);
return 0;
}

wikioi 1002 旁路的更多相关文章

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

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

  2. Bestcoder#5 1002

    Bestcoder#5 1002 Poor MitsuiTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  3. acm 1002 算法设计

    最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...

  4. BestCoder Round 69 Div 2 1001&& 1002 || HDU 5610 && 5611

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5610 如果杠铃总质量是奇数直接impossible 接着就考验耐心和仔细周全的考虑了.在WA了三次后终于发 ...

  5. 1002. A+B for Polynomials (25)

    题目链接:https://www.patest.cn/contests/pat-a-practise/1002 原题如下: This time, you are supposed to find A+ ...

  6. 字符串专题:map POJ 1002

    第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ ...

  7. 1002 Phone Numbers 解题报告

    1002. Phone Numbers Time limit: 2.0 secondMemory limit: 64 MB In the present world you frequently me ...

  8. HOJ 1001: A+B; 1002: A+B+C

    两道水题,用来熟悉 HOJ 的提交系统. 1001:输入两个整数 A, B (0 <= A,B <= 10),输出 A+B. #include <iostream> using ...

  9. 杭电acm 1002 大数模板(一)

    从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...

随机推荐

  1. F5当刷新页面,出现“要再次显示此页,web该浏览器,你曾经有过发送消息再次提交...点击重试&quot;,如何防止此对话框解决方案的出现,

    如何取消刷新页面弹出"重试"对话? 找了好多类似的问题都没有我想要的答案,请大家看清楚再回答. 比方说,登录过程中,成功之后转向还有一个页面success.jsp, 这时,假设刷新 ...

  2. NPOI+ExcelReport

    分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续2篇-模板导出综合示例)   自ExcelUtility类推出以来,经过项目中的实际使用与不断完 ...

  3. CodeForces 10C. Digital Root

    乞讨A.B.C ∈[1.N] && A*B != C,d(A*B) == d(C)组的数量. 首先要知道d(x) = (x%9 == 0 ? 9 : x%9); 那么则会有A*B == ...

  4. 为什么tap事件绑定在document上,而不是对象本身上

    1.在移动端前端开发,click事件有300ms的延时,为了提升用户体验,快速响应.zepto添加了tap事件.tap是在手指触屏横纵向移动距离小于30px,触发tap事件.移动距离的判断是通过tou ...

  5. Canvas翻转方法

     // 普通抽奖: // ctx.drawImage(img, px, py); // 级别"翻转"帆布 ctx.translate(canvas_width, 0); ctx. ...

  6. decimal ? 含义

    例如:   decimal ? je = zfje;   意思是  将 JE赋值为  ZFJE ,  并且允许  JE 为 NULL 值 这时JE为引用类型

  7. hdu4190 简单的二分法

    题意是 有n个城市,m个投票箱.接下来n个城市人口数,每一个投票箱都不能为空.计算最后投票箱的容量必须达到多少,才干满足须要. 每一个城市的人必须仅仅能将票投到自己城市分得得投票箱中.要是容量最小箱子 ...

  8. 深入理解Javascript闭包概念

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部能够直接读取全局变量 ...

  9. android 上手维修设备和推断启动服务

    下载链接:http://download.csdn.net/detail/a123demi/7511823 我们经常在开发的时候,通过获取系统已启动的服务来推断该server是否还须要再启动. 而本文 ...

  10. Android下拉刷新上拉载入控件,对全部View通用!

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38868463 前面写过一篇关于下拉刷新控件的博客下拉刷新控件终结者:Pull ...