Flody板子及其各类优化:Flody + 路径输出 ,Bellman-Ford,Bellman-Ford + 队列优化 + 前向星

void Flody()
{
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(G[i][j]>G[i][k]+G[k][j])
                {
                    G[i][j]=G[i][k]+G[k][j];
                }
            }
        }
    }
}
//Flody + 路径输出

//初始化,两点间无道路,e[i][j]初始化为正无穷
//	如果两点间有道路,记录每点的后驱 path[i][j] = j;

void flody()
{
    For(k,1,N)
    {
        For(i,1,N)
        {
            For(j,1,N)
            {
                if(e[i][j] == e[i][k] + e[k][j])
                {
                    if(path[i][j] > path[i][k])//找到字典序最小的路path[i][j] = path[i][k];
                }
                if(e[i][j] > e[i][k] + e[k][j])
                {
                    e[i][j] = e[i][k] + e[k][j];
                    path[i][j] = path[i][k];
                }
            }
        }
    }
}

//Bellman-Ford

//存图
int tot;
struct Node
{
    int u, v, w;
} e[4005];
void add(int u, int v, int w)
{
    e[tot].u = u;
    e[tot].v = v;
    e[tot++].w = w;
}
int dis[1005];
int Bellman_Ford(int u, int En)
{
    memset(dis,0x3f,sizeof(dis));
    dis[u] = 0;
    For(i,2,N)
    {
        int check = 1;
        For(j,0,tot)//遍历所有边
        {
            if(dis[ e[j].v ] > dis[ e[j].u ] + e[j].w)
            {
                dis[ e[j].v ] = dis[ e[j].u ] + e[j].w;
                check = 0;
            }
        }
        if(check) break;
    }
    For(j,0,tot)//判断 有无负环
    {
        if(dis[ e[j].v ] > dis[ e[j].u ] + e[j].w) return -1;//存在负环
    }
    int main()
    {
        tot = 0;
        while(M--)	//路径数
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);	//单向边
        }
        printf("%d\n",Bellman_Ford(1,N));
        return 0;
    }

//Bellman-Ford + 队列优化 + 前向星

//存图使用前向星

int dis[1005], cnt[1005];
bool book[1005];

int spfa(int u, int En)
{
    memset(book,false,sizeof(book));
    memset(cnt,0,sizeof(cnt));
    memset(dis,0x3f,sizeof(dis));
    book[u] = 1;
    cnt[u] = 1;
    dis[u] = 0;

    queue<int> q;
    q.push(u);
    while(!q.empty())
    {
        u = q.front();
        q.pop();
        book[u] = 0;
        for(int i = first[u]; ~i; i = e[i].next)
        {
            if(dis[ e[i].v ] > dis[u] + e[i].w)
            {
                dis[ e[i].v ] = dis[u] + e[i].w;

                if(!book[ e[i].v ])
                {
                    q.push(e[i].v);
                    book[e[i].v] = 1;
                    cnt[ e[i].v ]++;
                    if(cnt[ e[i].v ] > N) return -1; //存在负环
                }
            }
        }
    }
    return dis[En];
}

 

全部评论

相关推荐

咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务