单源最短路(bellmanford&spfa)

来源:互联网 发布:全聚合电视直播软件 编辑:程序博客网 时间:2024/05/22 02:17

这个题是热浪http://codevs.cn/problem/1557/
其实吧,感觉最短路很复杂。其实就是很复杂。
如果你见过bellmanford,你马上就能理解spfa
bellmanford是严格n方,加上队列优化最好可以nlogn,但很容易卡成n方。
这个东西很玄学。
所以让你(见过)一下

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int INF=1e9+7;int u[200100],v[200100],w[200100],d[200100];int n,m,st,en,temp,a,b,c,ans;void Bellman_ford(){    d[st]=0;    for(int i=1;i<=n-1;i++)        for(int j=1;j<=temp;j++)            if(d[u[j]]<INF)            {                d[v[j]]=min(d[v[j]],d[u[j]]+w[j]);            }    ans=d[en];}int main(){    scanf("%d %d %d %d",&n,&m,&st,&en);    for(int i=1;i<=n;i++)    d[i]=INF;    for(int i=1;i<=m;i++)    {        scanf("%d %d %d",&a,&b,&c);        u[++temp]=a;//这个就是邻接链表实现        v[temp]=b;        w[temp]=c;        u[++temp]=b;        v[temp]=a;        w[temp]=c;    }    Bellman_ford();    printf("%d",ans);    return 0;}

这个就是spfa

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;queue<int> q1;//队列优化const int INF=1e9;int temp,n,m,st,en,a,b,c,ans;bool book[200100];int fist[200100],nxt[200100],dis[200100];struct ll{    int u,v,w;}line[200100];void build(int x,int y,int z)//静态建表{    line[++temp].u=x;    line[temp].v=y;    line[temp].w=z;    nxt[temp]=fist[x];    fist[x]=temp;}void SPFA(int a,int b){    for(int i=1;i<=n;i++)    dis[i]=INF;//预处理    dis[a]=0;//a到a的距离最短为0    q1.push(st);//起点入队    book[st]=1;//起点已经入队    while(!q1.empty())//根据最短路,队列空时证明已经无法松弛操作,此时已有解    {        int k=q1.front();//由队首为节点扩展出的边        q1.pop();//用完就弹出去        book[k]=0;//用来更新其他节点        for(int i=fist[k];i!=-1;i=nxt[i])        {            int t=line[i].v;//当前边的终点            if(dis[t]>dis[k]+line[i].w)//如果到达这个点的距离可以被更新,松弛操作。            {                dis[t]=dis[k]+line[i].w;                if(!book[t])//如果已经入队,不再进行一遍操作。否则队列不会空。这正是队列优化的地方。                {                    book[t]=1;                    q1.push(t);                }            }        }    }    ans=dis[b];}int main(){    memset(fist,-1,sizeof(fist));    scanf("%d %d %d %d",&n,&m,&st,&en);    for(int i=1;i<=m;i++)    {        scanf("%d %d %d",&a,&b,&c);        build(a,b,c);        build(b,a,c);    }    SPFA(st,en);    printf("%d",ans);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 艾灸后皮肤极痒怎么办 拔罐如果有水泡怎么办 拔罐拔出水泡来怎么办 拔罐拔出了水泡怎么办 风湿引起的背疼怎么办 拔罐减肥不瘦怎么办 艾灸后脸上长痘怎么办 艾灸烟大怎么办 湿毛巾 月经推迟一个月了还不来怎么办 埋线了喝酒了怎么办 对待孩子脾气暴燥怎么办 买的新鞋子臭脚怎么办 鞋子臭脚怎么办如何除 惠普803墨盒干了怎么办 酷派手机无命令怎么办 华为手机锁机了怎么办 小孩被蜘蛛咬了怎么办 我是一个不爱说话的人怎么办 光动能手表停了怎么办 电波表收不到波怎么办 吃了壮阳药头疼怎么办 吃了伟哥后头痛怎么办 伟哥吃了不管用怎么办 钱站的钱还不起怎么办 面试工资要低了怎么办 线切割环保来查怎么办 喝白酒咽不下去怎么办 翠佛堂的玉假了怎么办 300英雄账号忘了怎么办 买了假酒不承认怎么办 买到假酒不承认怎么办 喝假酒胃里难受怎么办 怀孕初期塞药了怎么办 促黄体生成素高怎么办 激素脸痒的厉害怎么办 肾阴虚又肾阳虚怎么办 泡菜坛子太酸了怎么办 吃花粉过敏休刻怎么办 脸过敏怎么办才最有效 喝花粉后过敏了怎么办 阿比特龙耐药后怎么办