链式前向星
通过我的理解我觉得链式前向星就是一种用邻接表存图的方式,我们知道数据结构中向邻接表中插入元素有两种方式尾插法和头插法.如果我们用STL中vector模拟邻接表的话,当我们插入元素的时候,很显然它是用尾插法插入的元素.今天我就来说一下用头插法来实现插入,也就是上面所说的链式前向星.使用数组的方式来实现邻接表,并且向邻接表插入边(使用头插法).过程见下方模拟的图片.
用链式前向星来实现最短路
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int>P;
const int inf=0x3f3f3f3f;
const int Max_n=2e3+10;
int dis[Max_n],head[Max_n];
int cnt;
struct Edge{
int v,w;
int next;
}edge[2*Max_n];
priority_queue<P,vector<P>,greater<P> >q;
void add(int u,int v,int w){
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
memset(dis,inf,sizeof(dis));
dis[1]=0;
q.push(P(0,1));
while(!q.empty()){
P p=q.top();q.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=head[v];i!=-1;i=edge[i].next){
if(dis[edge[i].v]>dis[v]+edge[i].w){
dis[edge[i].v]=dis[v]+edge[i].w;
q.push(P(dis[edge[i].v],edge[i].v));
}
}
}
printf("%d\n",dis[n]);
return 0;
}
void add(int from,int to,int cost){
edge[cnt].to=to;
edge[cnt].cost=cost;
edge[cnt].next=head[from];
head[from]=cnt++;
}
LL Dijkstra(int n){
for(int i=1;i<=n;i++) dis[i]=inf;
q.push(P(0,1)); dis[1]=0;
while(!q.empty()){
P p=q.top();q.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=head[v];i!=-1;i=edge[i].next){
if(dis[edge[i].to]>dis[v]+edge[i].cost){
dis[edge[i].to]=dis[v]+edge[i].cost;
q.push(P(dis[edge[i].to],edge[i].to));
}
}
}
LL ans=0;
for(int i=1;i<=n;i++){
ans+=w[i]*dis[i];
if(dis[i]==inf)
return -1;
}
return ans;
}