Dijkstra算法模板,邻接表实现,邻接表是数组模拟实现的
Dijkstra适用于有向图、无向图。
图中不能有负权值,有负权则用SPFA算法
#include<cstdio>
#include<cstring>
const int N=1000;
const int M=10000;
struct edge//边结构体
{
int v,w,next;//边指向的顶点、边的权重、边指向节点的下一条边节点的下标
edge(){}
edge(int _v,int _w,int _next)
{
v=_v;
w=_w;
next=_next;
}
} e[M*2];//储存着所有的边
int head[N],size;//下标表示顶点,值表示该顶点指向的边节点的下标,size记录插入的边的条数
void initi()
{
memset(head,-1,sizeof(head));
size=0;
}
void insert1(int u,int v,int w)//插入一胎有向边
{
e[size]=edge(v,w,head[u]);
head[u]=size++;
}
void insert2(int u,int v,int w)//插入一条无向边
{
insert1(u,v,w);
insert1(v,u,w);
}
int n,m;//顶点数、边数
int dis[N];//存储源点到每个点的最短距离
bool vis[N];//标记是否被访问过
void Dijkstra(int u)//u是起点
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[u]=0;
for(int i=0;i<n;i++)
{
int mind=100000000;
int minj=-1;
for(int j=1;j<=n;j++)
{
if(dis[j]<mind&&!vis[j])
{
mind=dis[j];
minj=j;
}
}
if(minj==-1) return;
vis[minj]=true;
for(int k=head[minj];k!=-1;k=e[k].next)
{
int v=e[k].v;
int w=e[k].w;
if(!vis[v]&&dis[minj]+w<dis[v]) dis[v]=dis[minj]+w;
}
}
}
int main()
{
initi();
int u,v,w;//起点、终点、权重
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
insert2(u,v,w);//有向图则调用insert1();
}
Dijkstra(1);
printf("%d",dis[n]);
return 0;
}