习惯链式前向星的可以用这个模板,结合diijkstra算法本质,我们可以联想到用优先队列来实现
注意这里要用在结构体内自定义优先队列的出队顺序的写法,不熟悉的朋友可以去学习一下
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<string.h>
using namespace std;
const int N=1000;
struct node
{
int to;
int w;
int next;
}edge[N*2];
int head[N];
int cnt;
int dist[N];//到第i点的权值
bool vis[N];//是否访问过
int n,m;
void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
void init()
{
memset(dist,0x3f3f3f3f3f,sizeof(dist));//距离初始化到无穷
dist[1]=0;
}
struct mode
{
int idx;//坐标
int val;//dijk[idx]
bool operator<(const mode &it)const//自定义优先队列出对顺序
{
return val>it.val;//记住优先队列跟这里的返回值是反的,这里返回val大的,那么优先队列返回的就是val最小的
}
};
void dijkstra(int x)
{
priority_queue<mode>q;//定义优先队列
init();
mode h;
h.idx=x;h.val=dist[x];
q.push(h);//入队
while(!q.empty())
{
int tmp=q.top().idx;
q.pop();
if(vis[tmp])continue;
vis[tmp]=1;
for(int i=head[tmp];i;i=edge[i].next)//经典遍历
{
int to=edge[i].to;
//cout<<to<<endl;
if(dist[to]>dist[tmp]+edge[i].w)
{
dist[to]=dist[tmp]+edge[i].w;
//入队
h.idx=to;h.val=dist[to];
q.push(h);
}
}
}
for(int i=1;i<=n;i++)
{
cout<<dist[i]<<" ";
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b,w;
cin>>a>>b>>w;
add(a,b,w);
add(b,a,w);//双向
}
dijkstra(1);
return 0;
}