首页 > 代码库 > 【洛谷 p3371】模板-单源最短路径(图论)

【洛谷 p3371】模板-单源最短路径(图论)

题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

解法:spfa算法。

 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 typedef long long LL; 8  9 const int N=10010,M=500010;10 const LL INF=2147483647;11 int n,m,st,len=0;12 int vis[N],last[N];13 LL dis[N];14 struct edge{int x,y,next;LL d;}a[2*M];15 queue<int> q;16 17 void ins(int x,int y,LL d)18 {19     a[++len].x=x,a[len].y=y,a[len].d=d;20     a[len].next=last[x],last[x]=len;21 }22 void spfa()23 {24     for (int i=1;i<=n;i++) dis[i]=INF;25     memset(vis,0,sizeof(vis));26     while (!q.empty()) q.pop();27     dis[st]=0, vis[st]=1;28     q.push(st);29     while (!q.empty())30     {31       int x=q.front();32       q.pop(); vis[x]=0;33       for (int i=last[x];i;i=a[i].next)34       {35         int y=a[i].y;36         if (dis[x]+a[i].d<dis[y])37         {38           dis[y]=dis[x]+a[i].d;39           if (!vis[y]) vis[y]=1, q.push(y);40         }41       }42     }43 }44 int main()45 {46     scanf("%d%d%d",&n,&m,&st);47     int x,y; LL d;48     memset(last,-1,sizeof(last));49     for (int i=1;i<=m;i++)50     {51       scanf("%d%d%lld",&x,&y,&d);52       ins(x,y,d);53     }54     spfa();55     for (int i=1;i<=n;i++)56       printf("%lld ",dis[i]);57     printf("\n");58     return 0;59 }

 

【洛谷 p3371】模板-单源最短路径(图论)