wikioi 1002 旁路
意甲冠军:这个问题刚开始的问题,有错误的含义,原桥始建于一条直线。无论多么遥远。
思维: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 旁路的更多相关文章
- 【wikioi】1002 搭桥(dfs+最小生成树)
http://wikioi.com/problem/1002/ 今天开始又开始刷水了哈T_T.照着hzwer神犇的刷题记录刷!!! 题解: 一开始我也不会,但是我想到了直接爆搜T_T. 好吧,题解. ...
- Bestcoder#5 1002
Bestcoder#5 1002 Poor MitsuiTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- acm 1002 算法设计
最近突然想往算法方向走走,做了做航电acm的几道题 二话不说,开始 航电acm 1002 题主要是处理长数据的问题,算法原理比较简单,就是用字符数组代替int,因为int太短需要处理的数据较长 下面是 ...
- BestCoder Round 69 Div 2 1001&& 1002 || HDU 5610 && 5611
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5610 如果杠铃总质量是奇数直接impossible 接着就考验耐心和仔细周全的考虑了.在WA了三次后终于发 ...
- 1002. A+B for Polynomials (25)
题目链接:https://www.patest.cn/contests/pat-a-practise/1002 原题如下: This time, you are supposed to find A+ ...
- 字符串专题:map POJ 1002
第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ ...
- 1002 Phone Numbers 解题报告
1002. Phone Numbers Time limit: 2.0 secondMemory limit: 64 MB In the present world you frequently me ...
- HOJ 1001: A+B; 1002: A+B+C
两道水题,用来熟悉 HOJ 的提交系统. 1001:输入两个整数 A, B (0 <= A,B <= 10),输出 A+B. #include <iostream> using ...
- 杭电acm 1002 大数模板(一)
从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...
随机推荐
- C++学习笔记33 转换操作符
有时候,我们要转换为类类型和类类型,同时,这两个类继承关系不存在,这时候我们就需要一些所谓的转换操作符运营商. 一个简单的例子.类别A转换为int种类 #include <iostream> ...
- acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】
称号:acdream 1211 Reactor Cooling 分类:无汇的有上下界网络流. 题意: 给n个点.及m根pipe,每根pipe用来流躺液体的.单向的.每时每刻每根pipe流进来的物质要等 ...
- ROM签名脚本[原创]
下面的代码是bash脚本来的.需要保存为*.sh后序. # !/bin/bash #usage: signapk.sh [-hs] [zipfile-unsigned | update.zip] #A ...
- 重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息
原文:重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息 [源码下载] 重新想象 Windows 8 Store ...
- JavaScript概要
当用户填写表单在线,用户输入表单经常要推测在页面上,它提示用户填写正确的邮箱.哪些项目不填之类,这些都是JavaScript小的特点. JavaScript是一种基于对象的脚本语言,使用它能够开 ...
- MongoDB时间处理问题
MongoDB保存到数据库的时候,默认为UTC时间,在数据库保存时,会和当前时间有个间隔,差距为8小时. 在读取的时候,需要再次转换回来,比较麻烦. 其实,Mongo本身就已经提供了相应的处理方法,即 ...
- 计时器 Timer
计时器 Timer 不多说了,守则.
- 【JAVA】【NIO】3、Java NIO Channel
Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...
- 编程算法 - 数字数组中只出现一次 代码(C)
数字数组中只出现一次 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其它的数字都出现了两次. 请敲代码找出这 ...
- Apple Watch开发了一些细节和总结
本文旨在总结最近Watch在发展中遇到的问题和细节 1.左右Watch真机调试问题 一般的情况下,你为IOS主应用创建了一个extention,比方说Today Extension .Xcode都会自 ...