边表存图方法
加边
inline void add(int x,int y,int z)//cnt=0;
{
cnt++;
nxt[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
edge[cnt]=z;
}
遍历
eg:遍历与fr相连的边
for(int i=head[fr];i;i=nxt[i])
重载运算符(用于建立小根堆)
struct node{
int u,d;
bool operator<(const node & rhs)const{
return d>rhs.d;
}
};
然后是最短路算法
DIJKSTRA(堆优化)
inline void Dijkstra(int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=0x7fffffff;
}
priority_queue<node> Q;
dis[s]=0;
Q.push((node){s,0});
while(!Q.empty())
{
node fr=Q.top();Q.pop();
int u=fr.u;
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
int v=to[i],w=edge[i];
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
}
Q.push((node){v,dis[v]});
}
}
}
SPFA
inline void SPFA(int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=0x7fffffff;
}
queue<int> Q;
dis[s]=0;
inq[s]=1;
Q.push(s);
while(!Q.empty())
{
int fr=Q.front();Q.pop();
inq[fr]=0;
for(int i=head[fr];i;i=nxt[i])
{
int v=to[i],w=edge[i];
if(dis[v]>dis[fr]+w)
{
dis[v]=dis[fr]+w;
if(!inq[v])Q.push(v),inq[v]=1;
}
}
}
}