最短路模板
P3371 【模板】单源最短路径(弱化版) 题解-spfa
https://tbr-blog.blog.luogu.org/solution-p3371#
#include<iostream> #include<algorithm> #include<queue> const long long inf=2147483647; const int maxn=10005; const int maxm=500005; using namespace std; int n,m,s,num_edge=0; int dis[maxn],vis[maxn],head[maxm]; struct Edge{ int next,to,dis; }edge[maxm];//结构体表示静态邻接表 void addedge(int from,int to,int dis){//邻接表建图 edge[++num_edge].next=head[from];//链式存储下一条出边 edge[num_edge].to=to;//当前节点编号 edge[num_edge].dis=dis;//本条边的距离 head[from]=num_edge;//记录下一次的出边情况 } void spfa(){ queue<int> q; for(int i=1;i<=n;i++){ dis[i]=inf;//带权图初始化 vis[i]=0;//记录点i是否在队列中 } q.push(s);//第一个顶点入队,进行标记 dis[s]=0; vis[s]=1; while(!q.empty()){ int u=q.front();//取出队首 q.pop(); vis[u]=0;//出队标记 for(int i=head[u];i;i=edge[i].next){//邻接表遍历 int v=edge[i].to; if(dis[v]>dis[u]+edge[i].dis){//如果有最短路就更改 dis[v]=dis[u]+edge[i].dis; if(vis[v]==0){//未入队则入队 vis[v]=1;//标记入队 q.push(v); } } } } } int main(){ cin>>n>>m>>s; for(int i=1;i<=m;i++){ int f,g,w; cin>>f>>g>>w; addedge(f,g,w);//建图,有向图连一次边 } spfa(); for(int i=1;i<=n;i++){ if(s==i){ cout<<0<<" "; } else{ cout<<dis[i]<<" "; } } return 0; }
🍀取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣🍀
🍀每天都要有收获 (*/ω\*)🍀
🍀后悔是没有用的,从现在开始,立刻马上去做(≧∀≦)ゞ🍀