zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    《生命摆渡人》 读书笔记 读后感
    《饮食术》 读书笔记 读后感
    《天生有罪》读后感 读书笔记
    《内在动机》 读后感 读书笔记
    《从疾病到人心》读后感 读书笔记
    Python 入门书籍文档推荐及学习笔记总结
    JavaScript 入门书籍推荐及学习笔记总结 -- 《JavaScript权威指南》
    JavaScript中window.onload事件与document.ready事件的区别
    CentOS 7 中安装 MySQL 8 以及 MySQL 常用操作
    Python 杂记:argparse 模块
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5278268.html
Copyright © 2011-2022 走看看