最短路
Posted lightyachoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路相关的知识,希望对你有一定的参考价值。
dijkstra+堆优化:
code:
#include<bits/stdc++.h> using namespace std; const int N=3e5; int n,m; int s,x,y,w; int head[N]; int dis[N]; bool vis[N]; int cnt; struct edge{ int to; int ne; int w; }e[N]; struct node{ int dis; int pos; bool operator <(const node &x)const { return x.dis<dis; } }; priority_queue<node>q; void add(int u,int v,int w){ e[++cnt].to=v; e[cnt].w=w; e[cnt].ne=head[u]; head[u]=cnt; } void dij(){ dis[s]=0; q.push( (node) {0,s}); while(!q.empty()){ node temp = q.top(); q.pop(); int x=temp.pos; int d=temp.dis; if(vis[x])continue; vis[x]=1; for(int i=head[x];i;i=e[i].ne){ int y=e[i].to; if(dis[y]>dis[x]+e[i].w){ dis[y]=dis[x]+e[i].w; if(!vis[y]){ //vis[y]=1; q.push( (node){dis[y],y}); } } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&w); add(x,y,w); } dij(); for(int i=1;i<=n;i++){ printf("%d ",dis[i]); } return 0; }
spfa:
code:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=6e5; const int INF=2147483647; int n,m,s; int x,y,w; bool vis[N]; int dis[N]; int head[N],cnt; queue<int>q; struct node{ int to; int ne; int w; }e[N]; void add(int u,int v,int w){ e[++cnt].to=v; e[cnt].ne=head[u]; e[cnt].w=w; head[u]=cnt; } void spfa(int s){ //memset(dis,0x3f,sizeof(dis)); for(int i=1;i<=n;i++){ dis[i]=INF; vis[i]=false; } dis[s]=0; q.push(s); vis[s]=true; while(!q.empty()){ int u = q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].ne){ int v = e[i].to; if(dis[u]+e[i].w<dis[v]){ dis[v]=dis[u]+e[i].w; if(!vis[v]){ q.push(v); vis[v]=true; } } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&w); add(x,y,w); } spfa(s); for(int i = 1;i <= n;i++){ if(s==i)printf("0 "); else printf("%d ",dis[i]); } return 0; }
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=6e5; const int INF=2147483647; int n,m,s; int x,y,w; bool vis[N]; int dis[N]; int head[N],cnt; queue<int>q; struct node{ int to; int ne; int w; }e[N]; void add(int u,int v,int w){ e[++cnt].to=v; e[cnt].ne=head[u]; e[cnt].w=w; head[u]=cnt; } void spfa(int s){ //memset(dis,0x3f,sizeof(dis)); for(int i=1;i<=n;i++){ dis[i]=INF; vis[i]=false; } dis[s]=0; q.push(s); vis[s]=true; while(!q.empty()){ int u = q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].ne){ int v = e[i].to; if(dis[u]+e[i].w<dis[v]){ dis[v]=dis[u]+e[i].w; if(!vis[v]){ q.push(v); vis[v]=true; } } } } } int main(){ scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&w); add(x,y,w); } spfa(s); for(int i = 1;i <= n;i++){ if(s==i)printf("0 "); else printf("%d ",dis[i]); } return 0; }
求正权图最短路用dijkstra,求带有带有负权的用spfa
以上是关于最短路的主要内容,如果未能解决你的问题,请参考以下文章