#include<bits/stdc++.h>
using namespace std;
const int MAX=200050;
int N,M,S; //顶点数,边数,起点
int ans[N],vis[N]; //ans[i]--起点S到i点的当前最短路径。vis[i]=0--i点未做为中转点更新路径
__________________________________________________________
*******前向星存图
struct edge
{
int to,cost,next;
};
edge ED[MAX];
int head[MAX]; //MAX--边的最大条数
int cnt=1;
void add(int a,int b,int c)
{
ED[cnt].to=b;
ED[cnt].cost=c;
ED[cnt].next=head[a];
head[a]=cnt;
cnt++;
return ;
}
______________________________________________________-
*****************优先队列结构体
struct gg
{
int cost,now; //起点S离now点的距离为cost
friend bool operator <(gg a,gg b)
{
return a.cost>b.cost; //可自定义,gg队列优先返回cost值小的
}
};
————————————————————————————————-----------------------------------------------
void djs(int s) //起点 s
{
ans[s]=0; //起点到起点的最短路径为0
priority_queue<gg> Q;
gg p1,p2;
p1.cost=0;
p1.now=s;
Q.push(p1);
while(!Q.empty()) //队列为空时则当前最短路径值就为最短路径
{
p1=Q.top();
int u;
u=p1.now; //u为当前离起点最近的点(中转点)
Q.pop();
if(vis[u]) continue; //u之前已经做为中转点,跳过
vis[u]=1; //更新u
for(int i=head[u];i!=-1;i=ED[i].next) //遍历与u点相连的所有边
{
if(ans[ED[i].to]>ans[u]+ED[i].cost)
{
ans[ED[i].to]=ans[u]+ED[i].cost; //能利用u为中转点更新ans的值
p2.now=ED[i].to;
p2.cost=ans[p2.now];
Q.push(p2); //将更新的值推入队列
}
}
}
return ;
}
-------------------------------------------------
int main()
{
scanf("%d%d%d",&N,&M,&S);
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
memset(ans,9999999,sizeof(ans));
for(int i=1;i<=M;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
djs(S);
*****起点S到i点的最短路径为ans[i]
return 0;
}```
****[例题点这里](https://www.luogu.org/problemnew/show/P4779)
堆优化dijstra优先队列实现(前向星存图)
最新推荐文章于 2022-11-23 15:24:12 发布