题目大意:原题链接

解题思路:此题要求多点最短距离,但是直接套用floyd会超时.

然后我们想直接从每一个点开始bfs就好了,但是还是会TLE,为什么呢?

因为你访问了很多次没有意义的地方,因为有些点你曾经访问过,但是在你遍历边集的时候,你还去访问他,这个行为就会很多余。

所以我们用set来优化一下.

这个均摊下来,复杂度大概是n^2*logn的

最蛋疼的情况是你每次最多更新sqrt(n)个点,你需要更新sqrt(n)次,每次遍历和更新的复杂度都是logn,大概是这样……

输入             输入

3                 2

010             10

001             01

100             输出

输出             8

15               先介绍一下set的一些基本操作:参考链接

insert(key)              和vector中push_back()作用相同

erase(key)               删除键值key的值

erase(iterator)        删除定位器iterator指向的值

erase(first,second) 删除定位器first和second之间(左闭右开)的值

注意:

1.set中的数据是自动去重的;

2.it指向set的某个数,如果set这个数被erase,it的指针会变;

#include<set>
#include<queue>
#include<string>
#include<iostream>
using namespace std;
set<int> S;
int n,d[];
string g[];
queue<int> que;
long long ans=; void Spfa(int x)
{
S.clear();
while(!que.empty()) que.pop();
for(int i=;i<n;i++) d[i]=n;
for(int i=;i<n;i++){
if(i!=x)
S.insert(i);
}
d[x]=,que.push(x);
while(!que.empty()){
int u=que.front();
que.pop();
set<int>::iterator it=S.begin();//每次必须重新定义,因为set集合S每次都在变化
while(S.size()&&it!=S.end()){
int v=*it;
if(g[u][v]==''){
d[v]=d[u]+;
it++;//it++位置很重要
que.push(v);
S.erase(v);
}
else it++;
}
}
for(int i=;i<n;i++)
ans+=d[i]*d[i];
} int main()
{
cin>>n;
for(int i=;i<n;i++) cin>>g[i];
for(int i=;i<n;i++) Spfa(i);
cout<<ans<<endl;
}

CDOJ 1287 MC挖矿世界(Spfa+set优化)的更多相关文章

  1. HDU 1287 MC挖矿世界 set bfs

    MC挖矿世界 题目连接: http://acm.uestc.edu.cn/#/problem/show/1287 Description 银牌爷和柱神开始玩MC啦,但是怪物实在是太多了,于是银牌爷决定 ...

  2. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  3. SPFA 小优化*2

    /* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> ...

  4. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  5. 【最短路径】 SPFA算法优化

    首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...

  6. SPFA队列优化

    spfa队列优化(用来求最短路) 实现方法: 1.存入图.可以使用链式前向星或者vocter. 2.开一个队列,先将开始的节点放入. 3.每次从队列中取出一个节点X,遍历与X相通的Y节点,查询比对   ...

  7. spfa + slf优化

    最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...

  8. 最短路--spfa+队列优化模板

    spfa普通版就不写了,优化还是要的昂,spfa是可以判负环,接受负权边和重边的,判断负环只需要另开一个数组记录每个结点的入队次数,当有任意一个结点入队大于点数就表明有负环存在 #include< ...

  9. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

随机推荐

  1. QWidget切换

    QWidget切换,参考类:QstackedLayout,QStackedWidget,QTabWidget 一.Tab出现的位置 tabWidget.setTabPosition(QTabWidge ...

  2. HTTP报文-->MVC

    引用 学习Web开发不好好学习HTTP报文,将会“打拳不练功,到老一场空”,你花在犯迷糊上的时间比你沉下心来学习HTTP的时间肯定会多很多. HTTP请求报文解剖 HTTP请求报文由3部分组成(请求行 ...

  3. C语言的代码内存布局详解

    一个程序本质上都是由 BSS 段.data段.text段三个组成的.这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配, ...

  4. C语言数组的概念

    在<C语言数据输出大汇总以及轻量进阶>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <std ...

  5. poj_1860 SPFA

    题目大意 有N种货币,M个兑换点,每个兑换点只能相互兑换两种货币.设兑换点A可以兑换货币C1和C2,给出rate(C1--C2)表示1单位的C1货币可以兑换出的C2货币数目,rate(C2--C1)表 ...

  6. 如何把IOS应用,发给别人测试?

    ios应用,除了用XCODE连接真实设备调试以外,也可以制作ipa安包,发给别人测试.下面是具体步骤: 1. 把要测试的设备标识添加到你苹果开发账号的调试设备里.(可以用xcode或者itools查看 ...

  7. 【BZOJ5071】[Lydsy十月月赛]小A的数字 发现性质

    [BZOJ5071][Lydsy十月月赛]小A的数字 题解:一般遇到这种奇奇怪怪的操作,常用的套路是将原序列差分一下,或者求个前缀和什么的.本题就是直接对原序列求前缀和,然后发现一次操作相当于交换两个 ...

  8. 【BZOJ4726】[POI2017]Sabota? 树形DP

    [BZOJ4726][POI2017]Sabota? Description 某个公司有n个人, 上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他 下属(直接或者 ...

  9. 《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器

    原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...

  10. 初级Java面试题 - JavaSE篇

    p{font-size:18px;} li{font-size:18px;} 加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Java基本数据类型 ...