题目大意:原题链接

解题思路:此题要求多点最短距离,但是直接套用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. linux的tcz文件怎么安装?

    .tcz文件是Tiny core linux 应用安装包文件启动Tiny core linux后,可以使用tce-load命令安装软件如: tce-load -i /tmp/bftpd.tcz 转自: ...

  2. VC++ GetSafeHwnd用法

    GetSafeHwnd HWND GetSafeHwnd() const; 当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数. ...

  3. leetcode difficulty and frequency distribution chart

    Here is a difficulty and frequency distribution chart for each problem (which I got from the Interne ...

  4. 自学Ajax

    使用Ajax快捷函数 说明 出于简化AJAX开发工作的流程,jQuery提供了若干了快捷函数. 实例 1.显示 test.php 返回值(HTML 或 XML,取决于返回值). $.get(" ...

  5. m2014-c->c模拟java的hashmap容器类

    转自:http://bbs.csdn.net/topics/390034346 在java中像ArrayList,HashMap都是现成的,在java.util包中,用的时候直接import java ...

  6. 说说M451例程之PWM

    /**************************************************************************//** * @file main.c * @ve ...

  7. jquery如何获取type=hidden的input元素的值?

    function setHiddenFields() { var hiddens = $("input:hidden"); $.each(hiddens, function (in ...

  8. jquery树形菜单

    转自:http://keleyi.com/dev/3068696139522ae4.htm 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  9. uid-datepicker

    $("#txtPODate").daterangepicker({singleDatePicker: true,showDropdowns: true,minDate:'01/01 ...

  10. 160520、MyBatis的几种批量操作

    MyBatis中批量插入 方法一: <insert id="insertbatch" parameterType="Java.util.List"> ...