最短路径问题(HDU3790)

简介: 最短路径问题(HDU3790)

题目:

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,

如果最短距离有多条路线,则输出花费最少的。

Input

输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。

(1<n<=1000, 0<m<100000, s != t)

Output

输出 一行有两个数, 最短距离及其花费。

Sample Input

3 2
1 2 5 6
2 3 4 5
1 3
0 0

Sample Output

9 11

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题目描述: n个点,m条边,连接起点到终点的最短路径及其花费。

解题思路: 这是一个双权值的最短路径问题,注意在路径相同的情况下要花费最少的情况。

程序代码:

#include<stdio.h>
#include<string.h>
int e[1010][1010],dis[2020],book[2020],a[1010][1010],val[2020];
int inf=999999999;
int main()
{
  int i,j,n,m,t1,t2,t3,t4,u,v,min,s,t;
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    if(n==0&&m==0)
      break;
    memset(e,inf,sizeof(e));
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        if(i==j)  e[i][j]=0;
        else    e[i][j]=inf;
    for(i=1;i<=m;i++)
    {
      scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
      if(e[t1][t2]>t3)//可能多条路径输入多次,要距离最短的一次
      {
        e[t1][t2]=e[t2][t1]=t3;
        a[t1][t2]=a[t2][t1]=t4;
      } 
    }
    scanf("%d%d",&s,&t);
    for(i=1;i<=n;i++)
    {
      dis[i]=e[s][i];
      val[i]=a[s][i];
    }
    dis[s]=0;
    val[s]=0; 
    memset(book,0,sizeof(book));
    book[s]=1;
    for(i=1;i<n;i++)
    {
      min=inf;
      for(j=1;j<=n;j++)
      {
        if(book[j]==0&&dis[j]<min)
        {
          min=dis[j];
          u=j;
        }
      }
      book[u]=1;
      for(v=1;v<=n;v++)
      {
        if(e[u][v]<inf)
        {
          if(dis[v]>dis[u]+e[u][v])
          {
            dis[v]=dis[u]+e[u][v];
            val[v]=val[u]+a[u][v];
          }
          else if(dis[v]==dis[u]+e[u][v]&&val[v]>val[u]+a[u][v])//路径相同的情况下,要花费最少的。
            val[v]=val[u]+a[u][v];  
        }
      }
    }
    printf("%d %d\n",dis[t],val[t]);  
  }
  return 0;
} 
相关文章
|
C++ 开发者 编译器
C/C++经典面试50题(挑重点整理)下
重点整理了C/C++经典面试题
23033 0
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
629 1
Linux C/C++之IO多路复用(aio)
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
414 7
|
机器学习/深度学习 监控 安全
智能混凝土:自我修复与环境感应的建筑材料
【10月更文挑战第21天】智能混凝土是一种集自我修复与环境感应于一体的先进建筑材料。通过复合智能型组分,智能混凝土能够实现自感知、自适应和自修复,显著提高结构的耐久性和安全性,减少维修成本,促进环保节能。未来,智能混凝土将向多功能化、智能化和绿色化方向发展,为建筑行业带来革命性变革。
|
安全 Java 测试技术
code review 正确方式
code review 正确方式
329 1
|
负载均衡 监控 算法
【阿里二面面试题】说说你对 Raft 算法的理解?
【阿里二面面试题】说说你对 Raft 算法的理解?
1220 0
【阿里二面面试题】说说你对 Raft 算法的理解?
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
1135 2
|
机器学习/深度学习 人工智能 算法
人工智能伦理框架:构建AI的道德指南针
【7月更文挑战第16天】随着人工智能技术的快速发展,其对社会的深远影响引起了广泛关注。本文探讨了构建人工智能伦理框架的必要性,并提出了一套基于四大原则的伦理指导方针:透明度、公正性、责任归属和隐私保护。文章旨在为AI系统的设计与部署提供道德指南,确保技术进步与人类价值观相协调。
1015 3
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
【4月更文挑战第9天】本文探讨了Python在自动化测试中的应用,强调其作为热门选择的原因。Python拥有丰富的测试框架(如unittest、pytest、nose)以支持自动化测试,简化测试用例的编写与维护。示例展示了使用unittest进行单元测试的基本步骤。此外,Python还适用于集成测试、系统测试等,提供模拟外部系统行为的工具。在脚本编写实践中,Python的灵活语法和强大库(如os、shutil、sqlite3、json)助力执行复杂测试任务。同时,Python支持并发、分布式执行及与Jenkins、Travis CI等持续集成工具的集成,提升测试效率和质量。
747 3
|
XML JSON Rust
go vet中的那些检测项(2)
go vet中的那些检测项(2)
404 0

热门文章

最新文章