复习了最小生成树和最短路 

对于prim和dijk的算法复杂度都是o(n*n)

堆优化可以复杂度降为o((n+m)*log(m))

因此对于点数很多的稀疏图有较大的优化作用

dijk的堆优化 算法

而对于点数较少的图来说则无太大的优化作用

如图

上面是堆优化的disjk

对于小根堆的使用https://blog.csdn.net/xiaoquantouer/article/details/52015928

裸的模板题 作为例题

代码

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
vector<P> g[205];//first dis second to
priority_queue<P,vector<P>,greater<P> > q;
int vis[205];
int dis[205];
int main()
{
    int n,m;
    int s,e;
    while(~scanf("%d%d",&n,&m))
    {
        memset(vis,0,sizeof(vis));
        if(q.size()) q.pop();
        for(int i=0;i<=200;i++) g[i].clear();
        memset(dis,0x3f,sizeof(dis));
        int tmp1,tmp2,tmp3;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&tmp1,&tmp2,&tmp3);
            g[tmp1].push_back(make_pair(tmp3,tmp2));
            g[tmp2].push_back(make_pair(tmp3,tmp1));
        }
        scanf("%d%d",&s,&e);
        q.push(make_pair(0,s));
        dis[s]=0;
        while(q.size())
        {
            int tmp=q.top().second;
            if(vis[tmp]==1) {q.pop();continue;}
            q.pop();
            vis[tmp]=1;//选择加入v
            for(vector<P>::iterator it=g[tmp].begin();it!=g[tmp].end();it++)
            {
                int pos=dis[tmp]+it->first;
                if(pos<dis[it->second]&&vis[it->second]==0)
                {
                    dis[it->second]=pos;
                    q.push(make_pair(pos,it->second));
                }
            }
        }
        if(dis[e]==0x3f3f3f3f) printf("-1\n");
        else printf("%d\n",dis[e]);
    }

}