蓝桥杯--最短路

来源:互联网 发布:sql 查询没有借书学生 编辑:程序博客网 时间:2024/06/17 14:27
问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

解题思路:

求最短路的方法有dijkstra,floyd,spfa,本题结点达到20000,边数200000,对于n^2和n^3的算法肯定要超时,所以直接选用spfa

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct data{    int to,next,w;}e[202401];int head[20501];int dis[20501];int ne;int n,m,bg,ed;int d[200001],t=0,w=1;void insert(int u,int v,int w){    ne++;    e[ne].to=v;    e[ne].w=w;    e[ne].next=head[u];    head[u]=ne;}void spfa(){    dis[bg]=0;d[0]=bg;    int q;    while(t<w)    {        q=head[d[t]];        while(q!=0)        {            if(dis[e[q].to]>dis[d[t]]+e[q].w)            {            dis[e[q].to]=dis[d[t]]+e[q].w;            d[w++]=e[q].to;            }            q=e[q].next;        }        t++;    }}int main(){    memset(dis,0x3f3f3f3f,sizeof(dis));    bg=1;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        int u,v,w;        scanf("%d%d%d",&u,&v,&w);        insert(u,v,w);    }    spfa();    for(int i=2;i<=n;i++)    printf("%d\n",dis[i]);    return 0;}

0 0
原创粉丝点击