HDU-3790最短路径问题,第十遍终于过了~
最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
->
Link <-
这道题题意很简单,n个景点,m条路(双向),每条路有一个距离和花费,然后给定起点和终点,求起点到终点的最短距离及花费,如果最短路径有多条,输出花费最小的那条
基于数据范围不大,除了弗洛伊德其他的最短路解法都是可以的,博主习惯用迪杰斯特拉,所以本文介绍dij的解法;
思路;最短路的变形,以前都是直接求出起点到终点的最短路,而这里就是加上了一个花费问题,所以我们在用dij算法时注意如果路径相同的时候取花费小的即可,否则,只要路径小,两个变量都无条件变;
坑点:样例水过,就是不知道跪在哪,看了讨论区才知道有重边的情况,所以在输入的时候需要注意如果两个点路径有多条相同的取花费小的,否则取路径最短的那条不用管花费;也就是说,不管在输入或者输出的时候都要以路径为前提,一定要的是最短的,如果最短的有多条再取花费小的;
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
const int N=1000+10;
struct node
{
int p,d;
} a[N][N];输入的;
struct node1
{
int d,p;
} v[N];起点到i点的最短路径及花费;
int vis[N];
int main()
{
int n,m,xx,yy,i,j,d,p;
while(~scanf("%d%d",&n,&m)&&n&&m)
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
a[i][j].d=a[i][j].p=(i==j?0:INF);
memset(vis,0,sizeof(vis));
for(i=1; i<=m; i++)
{
scanf("%d%d%d%d",&xx,&yy,&d,&p);
if(d<a[xx][yy].d)//如果最短路只有一条,两个变量都无条件改变;
{
a[xx][yy].d=a[yy][xx].d=d;
a[xx][yy].p=a[yy][xx].p=p;
}
else if(d==a[xx][yy].d)//有多条相同的时候才取花费最小的;
{
a[xx][yy].p=a[yy][xx].p=min(p,a[xx][yy].p);
}
}
scanf("%d%d",&xx,&yy);
for(i=1; i<=n; i++) v[i].d=v[i].p=i==xx?0:INF;
for(i=1; i<=n; i++)
{
int x,mm=INF;
for(j=1; j<=n; j++)
if(!vis[j]&&v[j].d<=mm)
mm=v[x=j].d;
vis[x]=1;
for(j=1; j<=n; j++)
{
if(v[j].d>a[x][j].d+v[x].d)
{
v[j].d=a[x][j].d+v[x].d;
v[j].p=a[x][j].p+v[x].p;
}
else if(v[j].d==a[x][j].d+v[x].d)//如果最短路径有多条,取花费最小的;
v[j].p=min(v[j].p,a[x][j].p+v[x].p);
} }
printf("%d %d\n",v[yy].d,v[yy].p);
}
return 0;
}
HDU-3790最短路径问题,第十遍终于过了~的更多相关文章
- ACM: HDU 3790 最短路径问题-Dijkstra算法
HDU 3790 最短路径问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题目大意:题意明了,输出最短路径及其花费. 需要注意的几点:(1)当最短路径相同时,输出最小花费 ...
- hdu 3790 最短路径问题(两个限制条件的最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=3790 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. dijkstra,仅仅是在推断条件时 ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 题解报告:hdu 3790 最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
- hdu 3790 最短路径问题(迪杰斯特拉)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
随机推荐
- [ZPG TEST 108] blockenemy【树形dp】
T3:blockenemy blockenemy.pas/in/out 128M 1s 你在玩电子游戏的时候遇到了麻烦...... 你玩的游戏是在一个虚拟的城市里进行,这个城市里有n个点,都从0~n- ...
- Chtholly Tree (珂朵莉树) ODT
ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...
- 链表中用标兵结点简化代码 分类: c/c++ 2014-09-29 23:10 475人阅读 评论(0) 收藏
标兵结点(头结点)是在链表中的第一个结点,不存放数据,仅仅是个标记 利用标兵结点可以简化代码.下面实现双向链表中的按值删除元素的函数,分别实现 带标兵结点和不带标兵结点两版本,对比可见标兵结点的好处. ...
- HttpURLConnection教程
1.Class Overview An URLConnection for HTTP (RFC 2616) used to send and receive data over the web. Da ...
- DEV—【GridControl添加按钮列】
效果图 打开GridControl的Run Designer在左侧栏中找到: 添加一个ButtonEdit: 更改属性中的值:Caption为按钮上显示的Text:Kind为按钮的类型: 然后拖到最后 ...
- DEV—【GridControl 按钮列无法触发点击事件解决方案】
需要在按钮列的OptionColumn属性栏中找到下面两个属性,并且改为True AllowEdit=True,AllowFocus=True.
- css3中的变换、动画和过渡
变换:分为2d变换和3d变换,但一次只能用一个变换属性,多个的话最后一个会覆盖前面所有最终被浏览器实现,变换可以成为过渡和动画的一个待变参数(类似width,opacity等). 过渡:是动画的初始模 ...
- android环境搭建环境 cordova run android gradle wrapper报错
cordova run android命令报错 Error: Could not find an installed version of Gradle either in Android Studi ...
- 波哥!一个不安分的IT男
第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...
- 「Python调试器」,快速定位各种疑难杂症!!
现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要 ...