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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用BigDecimal进行科学计算表示方式的转换

    使用BigDecimal进行科学计算表示方式的转换使用BigDecimal进行科学计算表示方式的转换

    2022年6月17日
    26
  • spring 事务管理 随笔

    spring 事务管理 随笔

    2021年5月9日
    108
  • Android特效开发(仿zaker用手向上推动的效果(推动门效果))

    本文由manymore13原创,转载请标明出处 http://blog.csdn.net/manymore13/article/details/12219687     最近在商店下载了zaker ,闲暇时拿来看看新闻!发现每次打开软件进入主界面时有个界面,需要你把它往上滑到一定距离才能进入到主界面。每次进入软件时它的背景可能不一样,在往上拨的时候你会看见主界面,好似向上推的门一样!

    2022年3月10日
    31
  • 图片切割系统_图片切片工具

    图片切割系统_图片切片工具上一阵子做过一个图片切割效果,得到很多人关注。其中有很多人向我询问如何做一个真正的图片切割(裁剪),这里需要声明一下:首先js是不能操作客户端文件的(除非特殊情况),所以图片的切割必须在后台处理,对于

    2022年8月1日
    0
  • 女生适合学习Java吗?

    女生适合学习Java吗?在这个信息爆炸的时代,互联网行业成为了高薪的代名词,Java技术因其具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,作为最流行的语言,学习的人也是越来越多。在很多人看来,学习java似乎是男生的专利,难道真的只有男生才能学好Java成为优秀的java工程师吗?“女生适合学Java吗?”“女程序员就业前景好不好?”“女生学Jav

    2022年7月8日
    91
  • 天翼云IP_天翼网关ip地址

    天翼云IP_天翼网关ip地址在很多应用场景中,需要在云平台中搭建高可用集群,就这需要用到虚拟IP地址功能。今天就来谈一谈虚拟IP地址及它的应用场景。一、高可用集群在谈虚拟IP地址前,我们先了解一下什么叫高可用集群。高可用集群(HighAvailabilityCluster),或者叫故障转移集群(FailoverCluster),它是指通过集群软件,将几台服务器组合为一个集群系统提供服务,这些服务器中同一时间内一般只有一台在提供服务(称之为主节点或者Master节点),其…

    2022年10月20日
    0

发表回复

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

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