wing是什么_最短路径floyd算法例题

wing是什么_最短路径floyd算法例题给定一个由 n 行数字组成的数字梯形如下图所示。梯形的第一行有 m 个数字。从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。规则 1:从梯形的顶至底的 m 条路径互不相交。规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。对于给定的数字梯形,分别按照规则 1,规则 2,和规则 3 计算出从梯形的顶至底的 m 条路径,使这 m 条路径经过的数字总和最大。输入格式第 1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

给定一个由 n 行数字组成的数字梯形如下图所示。

梯形的第一行有 m 个数字。

从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。

规则 1:从梯形的顶至底的 m 条路径互不相交。

规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。

规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。
在这里插入图片描述

对于给定的数字梯形,分别按照规则 1,规则 2,和规则 3 计算出从梯形的顶至底的 m 条路径,使这 m 条路径经过的数字总和最大。

输入格式
第 1 行中有 2 个正整数 m 和 n,分别表示数字梯形的第一行有 m 个数字,共有 n 行。

接下来的 n 行是数字梯形中各行的数字。第 1 行有 m 个数字,第 2 行有 m+1 个数字,以此类推。

输出格式
将按照规则 1,规则 2,和规则 3 计算出的最大数字总和输出,每行输出一个最大总和。

数据范围
1≤n,m≤20,
梯形中的数字范围 [1,1000]。

输入样例:
2 5
2 3
3 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1
输出样例:
66
75
77
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1200, M = 4000, INF = 1e8;

int m, n, S, T;
int h[N], e[M], f[M], w[M], ne[M], idx;
int q[N], d[N], pre[N], incf[N];
bool st[N];
int id[40][40], cost[40][40];

void add(int a, int b, int c, int d)
{ 
   
    e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx ++ ;
    e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx ++ ;
}

bool spfa()
{ 
   
    int hh = 0, tt = 1;
    memset(d, -0x3f, sizeof d);
    memset(incf, 0, sizeof incf);
    q[0] = S, d[S] = 0, incf[S] = INF;
    while (hh != tt)
    { 
   
        int t = q[hh ++ ];
        if (hh == N) hh = 0;
        st[t] = false;

        for (int i = h[t]; ~i; i = ne[i])
        { 
   
            int ver = e[i];
            if (f[i] && d[ver] < d[t] + w[i])
            { 
   
                d[ver] = d[t] + w[i];
                pre[ver] = i;
                incf[ver] = min(f[i], incf[t]);
                if (!st[ver])
                { 
   
                    q[tt ++ ] = ver;
                    if (tt == N) tt = 0;
                    st[ver] = true;
                }
            }
        }
    }
    return incf[T] > 0;
}

int EK()
{ 
   
    int cost = 0;
    while (spfa())
    { 
   
        int t = incf[T];
        cost += t * d[T];
        for (int i = T; i != S; i = e[pre[i] ^ 1])
        { 
   
            f[pre[i]] -= t;
            f[pre[i] ^ 1] += t;
        }
    }
    return cost;
}

int main()
{ 
   
    int cnt = 0;
    scanf("%d%d", &m, &n);
    S = ++ cnt;
    T = ++ cnt;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m + i - 1; j ++ )
        { 
   
            scanf("%d", &cost[i][j]);
            id[i][j] = ++ cnt;
        }

    // 规则1
    memset(h, -1, sizeof h), idx = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m + i - 1; j ++ )
        { 
   
            add(id[i][j] * 2, id[i][j] * 2 + 1, 1, cost[i][j]);
            if (i == 1) add(S, id[i][j] * 2, 1, 0);
            if (i == n) add(id[i][j] * 2 + 1, T, 1, 0);
            if (i < n)
            { 
   
                add(id[i][j] * 2 + 1, id[i + 1][j] * 2, 1, 0);
                add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, 1, 0);
            }
        }
    printf("%d\n", EK());

    // 规则2
    memset(h, -1, sizeof h), idx = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m + i - 1; j ++ )
        { 
   
            add(id[i][j] * 2, id[i][j] * 2 + 1, INF, cost[i][j]);
            if (i == 1) add(S, id[i][j] * 2, 1, 0);
            if (i == n) add(id[i][j] * 2 + 1, T, INF, 0);
            if (i < n)
            { 
   
                add(id[i][j] * 2 + 1, id[i + 1][j] * 2, 1, 0);
                add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, 1, 0);
            }
        }
    printf("%d\n", EK());

    // 规则3
    memset(h, -1, sizeof h), idx = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m + i - 1; j ++ )
        { 
   
            add(id[i][j] * 2, id[i][j] * 2 + 1, INF, cost[i][j]);
            if (i == 1) add(S, id[i][j] * 2, 1, 0);
            if (i == n) add(id[i][j] * 2 + 1, T, INF, 0);
            if (i < n)
            { 
   
                add(id[i][j] * 2 + 1, id[i + 1][j] * 2, INF, 0);
                add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, INF, 0);
            }
        }
    printf("%d\n", EK());

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168564.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 空间向量和矩阵_线性无关的函数内积为零吗

    空间向量和矩阵_线性无关的函数内积为零吗文章目录前言一、集合的基本概念二、向量空间1.运算规则和定理2.RnR^nRn和CnC^nCn三、实内积空间1.内积2.范数四、复内积空间五、线性映射前言本文学习过程来源是《矩阵分析与应用-张贤达》一书.可以通过z-lib下载.线性空间是某一类事物在矩阵代数里的一个抽象的集合表示,线性映射或线性变换则反映线性空间中元素间最基本的线性关系.上面这句话出自书中第14页开头,读下来第一感觉就是云里雾里,毕竟出现了新的名称.对于线性空间可以简单的把它理解为几何空间(实际上不仅仅

    2022年10月21日
    2
  • 在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程

    在线客服系统源码 自适应手机移动端 支持多商家 带搭建教程下载链接:在线客服系统源码自适应手机移动端支持多商家支持微信公众号/微信小程序带搭建教程-PHP文档类资源-CSDN下载PHP轻量级人工在线客服系统源码自适应手机移动端支持多商家带搭建教程支持多商家支持多商家,每个注册用户为一个商家,每个商家可以添加多个客服。不限坐席每个商家可以无限添加坐席,不限制坐席数支持H5移动端系统自动适配移动端,也可以接入app(h5方式)支持微信公众号/微信小程序客服可以与微信公众号/小程序里的访客实时沟通常见问题自动回复…

    2022年7月19日
    20
  • 智能家居,如何离我们有多远?

    智能家居,如何离我们有多远?

    2022年1月4日
    44
  • 基于Python的OpenCV人脸检测

    基于Python的OpenCV人脸检测本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:1、检测图片中的人脸2、实时检测视频中出现的人脸3、用运设备的摄像头实时检测人脸提前做的准备:安装好Python3下载安装OpenCV库,方法是pipinstallopencv-python-ihttps://mirrors.aliyun.com/pypi/simple/–trusted-host=mirrors.aliyun.com/pypi/simple下载特征数据HAAR和LBP,这两种数

    2022年6月7日
    32
  • pycharm输入不了中文_pycharm连接服务器ssh

    pycharm输入不了中文_pycharm连接服务器ssh一、点击【File】—【Setting】—【Editor】—【FileEncoding】页面,设置global和projectencoding为UTF-8,然后点击Apply。二、点击【File】—【Setting】—【Editor】—【FileandCodeTemplates】,点击右边的【pythonscript】,在编辑框中输入:#-*-coding:utf-8-*-,保存设置之后,关闭pycharm.三、下载最新的搜狗输入法安装即可,再打开p

    2022年8月25日
    8
  • 收集了50道基础的java面试题

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最

    2021年12月23日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号