HDU 1287 MC挖矿世界 set bfs
MC挖矿世界
题目连接:
http://acm.uestc.edu.cn/#/problem/show/1287
Description
银牌爷和柱神开始玩MC啦,但是怪物实在是太多了,于是银牌爷决定去挖点钻石提升装备。
来到矿脉的银牌爷发现矿脉错综复杂。
矿脉是由一些矿洞和一些通道组成的,通道连着不同的矿洞。
矿洞的编号从11到nn
聪明的银牌爷定义了矿脉的复杂度为下面的式子:
∑ni=1∑nj=1δ(i,j)2∑i=1n∑j=1nδ(i,j)2
其中δ(i,j)δ(i,j)表示矿洞ii到矿洞jj的最短路
如果最短路不存在,则为nn
现在给出一个矿脉,银牌爷想知道这个矿脉的复杂度是多少?
Input
输入一个整数nn,1<=n<=20001<=n<=2000,表示总共nn个矿洞,接下来nn行nn列,第ii行jj列的值aij=1aij=1或者aij=0aij=0,如果aij=1aij=1,表示从矿洞ii到矿洞jj有一条长为11的边,如果aij=0aij=0,则表示从ii到jj没有直接的边
Output
输出一个整数,表示矿脉的复杂度
Sample Input
3
010
001
100
Sample Output
15
Hint
题意
题解:
最无脑的就是flyod,但是这个显然不会让你过啦
然后我们想直接从每一个点开始bfs就好了,但是还是会tle,为什么呢?
因为你访问了很多次没有意义的地方,因为有些点你曾经访问过,但是在你遍历边集的时候,你还去访问他,这个行为就会很多余。
所以我们用set来优化一下。
这个均摊下来,复杂度大概是n^2*logn的
最蛋疼的情况是你每次最多更新sqrtn个点,你需要更新sqrtn次,每次遍历和更新的复杂度都是logn,大概是这样……
对了:it指向set的某个数,如果set这个数被erase,it的指针会变……
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2005;
set<int> S;
string s[maxn];
long long ans = 0;
int n,d[maxn];
queue<int>Q;
void solve(int x)
{
S.clear();while(!Q.empty())Q.pop();
for(int i=0;i<n;i++)if(i!=x)S.insert(i);
for(int i=0;i<n;i++)d[i]=n;
d[x]=0,Q.push(x);
while(!Q.empty())
{
int u = Q.front();Q.pop();
set<int>::iterator it=S.begin();
while(S.size()&&it!=S.end())
{
int v=*it;
if(s[u][v]=='1')
{
d[v]=d[u]+1;
it++;
S.erase(v);
Q.push(v);
}
else it++;
}
}
for(int i=0;i<n;i++)
ans+=d[i]*d[i];
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)cin>>s[i];
for(int i=0;i<n;i++)solve(i);
cout<<ans<<endl;
}
HDU 1287 MC挖矿世界 set bfs的更多相关文章
- CDOJ 1287 MC挖矿世界(Spfa+set优化)
题目大意:原题链接 解题思路:此题要求多点最短距离,但是直接套用floyd会超时. 然后我们想直接从每一个点开始bfs就好了,但是还是会TLE,为什么呢? 因为你访问了很多次没有意义的地方,因为有些点 ...
- HDU.2612 Find a way (BFS)
HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...
- HDU 2717 Catch That Cow (bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 Catch That Cow Time Limit: 5000/2000 MS (Java/Ot ...
- HDU 1044 Collect More Jewels(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 5876:Sparse Graph(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=5876 Sparse Graph Problem Description In graph theory, t ...
- HDU 1728:逃离迷宫(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有 ...
- HDU 1885 Key Task(三维BFS)
题目链接 题意 : 出口不止一个,一共有四种颜色不同的门由大写字母表示,而钥匙则是对应的小写字母,当你走到门前边的位置时,如果你已经走过相应的钥匙的位置这个门就可以走,只要获得一把钥匙就可以开所有同颜 ...
- hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...
随机推荐
- linux的主题与图标
我先在使用arch跟xfce, 速度没得说,偶尔用一下openbox 有一天将xfce的声音给搞没了,完全不知道哪里配置错了,只好将用户文件夹下的所有配置删除,然后重启进入一切又ok啦 说一下主题,小 ...
- Codeforces 870E Points, Lines and Ready-made Titles 计数
题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...
- DNSLOG在渗透测试中的玩法儿
首先了解一下DNS是啥??? DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读 ...
- docker之构建redis-cluster集群
下载和编译redis安装包 参考:https://www.cnblogs.com/cwp-bg/p/8094914.html # 从官方网站下载安装包,注意,当前在哪个目录下执行命令,下载的包将在哪个 ...
- makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解【转】
转自:http://www.cnblogs.com/lifexy/p/7065175.html 在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 ...
- SQL 变量 条件查询 插入数据
(本文只是总结网络上的教程) 在操作数据库时 SQL语句中难免会用到变量 比如 在條件值已知的情況下 INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值 ...
- linux系统查找具体进程
ps -ef | grep '查找内容' eg:ps -ef | grep '测试USB设备穿透'
- bash: composer: command not found
下载composer到本地:curl -sS https://getcomposer.org/installer | php 移动至系统服务:sudo mv composer.phar /usr/bi ...
- Activity工作流 -- java运用
一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ...
- 登陆记录utmp wtmp
/var/log/wtmp文件的作用 /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息. 查看方法: 可以用last命令输出当中内容: debian ...