复习了最小生成树和最短路
对于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]);
}
}