zoj1456[通俗易懂]

zoj1456[通俗易懂]zoj1456

大家好,又见面了,我是你们的朋友全栈君。

题目大意:

Spring国家有N个城市,每队城市之间也许有运输路线,也可能没有。现在有一些货物要从一个城市运到另一个城市。运输费有两部分组成:
城市之间的运输成本,路过一个城市的税,除了起点和终点城市。
你必须写一个程序找到最小成本的路线
输入:
a11 a12 … a1N
a21 a22 … a2N
……………
aN1 aN2 … aNN
b1 b2 … bN

c d
e f

g h
aij是从城市i到城市j的运输成本,aij=-1表明没有直达路线。bi表明路过城市i的税
货物从城市c运到城市d,城市e到城市f

解题思路:

Floyd算法

代码如下:

#include<stdio.h>
#include<iostream>
using namespace std;
#define N 110
#define MAX 9999999
int map[N][N][N];
int g[N][N];
int pre[N][N];
int n;
int cost[N];

void floyd()
{
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      if(g[i][j]==-1)
        map[0][i][j]=MAX;
      else
        map[0][i][j]=g[i][j];
    }
  }
  for(int k=1;k<=n;k++)
  {
    for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=n;j++)
      {
        map[k][i][j]=map[k-1][i][j];
        if(map[k][i][j]>map[k-1][i][k]+map[k-1][k][j]+cost[k])
        {
          map[k][i][j]=map[k-1][i][k]+map[k-1][k][j]+cost[k];
          pre[i][j]=pre[i][k];
        }
        else  
        if(map[k][i][j]==map[k-1][i][k]+map[k-1][k][j]+cost[k])
        {
          if(pre[i][k]<pre[i][j])
          {
            pre[i][j]=pre[i][k];
          }
        }
      }
    }
  }
}

int main()
{
  while(scanf("%d",&n)!=EOF&&n)
  {
    for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=n;j++)
      {
        scanf("%d",&g[i][j]);
        pre[i][j]=j;
      }
    }
    for(int i=1;i<=n;i++)
    {
      scanf("%d",&cost[i]);
    }
    int u,v,tmp;
    while(scanf("%d%d",&u,&v)&&u!=-1&&v!=-1)
    {
      floyd();
      tmp=u;

      printf("From %d to %d :\n",u,v);

      printf("Path: %d",u);

      while(tmp!=v)

      {

          printf("-->%d",pre[tmp][v]);

          tmp=pre[tmp][v];

      }

      printf("\n");

      printf("Total cost : %d\n",map[n][u][v]);

      printf("\n");

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

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

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


相关推荐

  • 修改tomcat端口号的文件_tomcat更改端口号在哪个目录

    修改tomcat端口号的文件_tomcat更改端口号在哪个目录修改Tomcat端口号步骤:1.找到Tomcat目录下的conf文件夹2.进入conf文件夹里面找到server.xml文件3.打开server.xml文件4.在server.xml文件里面找到下列信息maxThreads=”150″minSpareThreads=”25″maxSpareThreads=”75″

    2025年6月26日
    4
  • 打印小册子中断了怎么办呢_pdf小册子双面打印

    打印小册子中断了怎么办呢_pdf小册子双面打印在这里可以首先分享下针对小册子的打印方法,像wps针对pdf就提供打印小册子的设置,对于支持双面打印的打印机,小册子子集选择双面即可,而针对只能打单面的打印机,也不要慌,可以分两次打,先选择打正面,在选择打背面即可。这时候问题来了,如果打印的特别多,出现意外中断,比如没墨了,没纸了,很容易打印机无法暂存打印,打印任务就消失了,气的人想吐血。难道真的没有办法了么,…

    2025年9月18日
    14
  • datagrip安装教程与激活 3月最新注册码

    datagrip安装教程与激活 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    98
  • 前端缓存方案「建议收藏」

    前端缓存方案「建议收藏」前端几种本地缓存机制_蜗牛小前的博客-CSDN博客_前端本地缓存在漫长的前端开发过程中,我们常用的几种本地缓存机制:Cookie,LocalStorge,SessionStorge1.Cookie的特点1)cookie的大小受限制,cookie大小被限制在4KB,不能接受像大文件或邮件那样的大数据。2)只要有请求涉及cookie,cookie就要在服务器和浏览器之间来回传送(这解释为什么本地文件不能测试cookie)。而且coo…https://blog.csdn.net/weixin_397170..

    2025年7月10日
    4
  • 详细AutoEventWireup <@ Page language=c# AutoEventWireup=”false”和“True”>的研究

    详细AutoEventWireup <@ Page language=c# AutoEventWireup=”false”和“True”>的研究@Page里面的属性是ASP.NET页面中最基础的组成部分。可也包涵了很多麻烦在里面,因为种种原因导致必须研究一下这个属性AutoEventWireupAutoEventWireup用我的理解方式是这样:(Auto解释是自动,Event解释是事件,Wire解释关联结构模式,up解释是在上面)个人理解的方式来推断这个属性所实现的功能。首先,从浏览器触发的事件不能理科在本地得

    2022年5月27日
    36
  • linux pycharm激活码[免费获取][通俗易懂]

    (linux pycharm激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    244

发表回复

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

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