稀疏图:邻接矩阵
int h[N], e[N], ne[N], idx;
int w[N]; // 用来存权重
void add(int x, int y, int c)
{
w[idx] = c;
e[idx] = y;
ne[idx] = h[x];
h[x] = idx++;
}
堆优化相关stl:priority_queue
priority_queue<Type, Container, Functional>
如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。
#include<queue>
priority_queue<int> p;
priority_queue<int, vector<int>, greater<int> > p;
priority_queue<PII, vector<PII>, greater<PII>> heap; // 定义一个小根堆
几种图最短路径比较
朴素dijstra
稠密图 存储结构 g[N][N]
不能有负边
dijstra堆优化
稀疏图 存储结构 邻接表
不能有负边
bellman-ford
每次
spfa
int spfa()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
queue<int> q;
q.push(1);
while(q.size())
{
int t=q.front();
q.pop();
st[t]=false;
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(dist[j]>dist[t]+w[i])
{
dist[j]=dist[t]+w[i];
if(!st[j])
{
q.push(j);
st[j]=true;
}
}
}
}
if(dist[n]==0x3f3f3f3f) return -2;
return dist[n];
}
floyd
//初始化
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(i==j) d[i][j]==0;
else d[i][j]=INF;
}
//函数
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}