题解报告:hdu 3790 最短路径问题
Problem Description
Input
(1<n<=1000, 0<m<100000, s != t)
Output
Sample Input
Sample Output
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
int n,m,a,b,d,p,s,t,dis[MAXN],cis[MAXN],cost[MAXN][MAXN],G[MAXN][MAXN];//dis数组记录当前节点离起点的最短路径,cis数组记录当前节点离起点的最小费用,cost数组和G数组分别记录费用和节点之间的关系
bool vis[MAXN];
void Dijkstra(){
for(int i=;i<=n;++i){//先默认初始化dis和cis为起点到各节点的最短路径和最小费用
dis[i]=G[s][i];
cis[i]=cost[s][i];
}
dis[s]=cis[s]=;vis[s]=true;//到自己的距离为0,且0花费
for(int i=;i<n;++i){ //剩下遍历n-1个节点
int k=-; //先标记为-1
for(int j=;j<=n;++j)//查找dis中的最小权值
if(!vis[j] && (k==- ||dis[j]<dis[k]))k=j;//找到最小权值的下标
if(k==-)break; //说明已经全部归纳了,直接退出当前循环,否则才可以进行下面的松弛操作
vis[k]=true; //该点已经归纳最短路径的集合
for(int j=;j<=n;++j){//更新起点到每个节点的最短路径
if(!vis[j]){ //如果还没有归纳进去
if(dis[j]>dis[k]+G[k][j]){
cis[j]=cis[k]+cost[k][j];
dis[j]=dis[k]+G[k][j];
}
else if(dis[j]==dis[k]+G[k][j] && cis[j]>cis[k]+cost[k][j]) //如果当前多条最短路径,则取两者中较小费用
cis[j]=cis[k]+cost[k][j];
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m) && (m+n)){
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)
if(i==j)G[i][j]=cost[i][j]=;//到自身的距离和费用都为0
else G[i][j]=cost[i][j]=INF;//其余初始化为INF
}
memset(vis,false,sizeof(vis));
for(int i=;i<=m;++i){
scanf("%d %d %d %d",&a,&b,&d,&p);
if(G[a][b]>d){//预处理,考虑到重边的情况
G[a][b]=G[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if(G[a][b]==d && cost[a][b]>p)//如果a到b的距离等于原来的话,取最小费用
cost[a][b]=cost[b][a]=p;
}
scanf("%d %d",&s,&t);
Dijkstra();
printf("%d %d\n",dis[t],cis[t]);
}
return ;
}
AC代码二(优先队列默认最大堆实现Dijkstra迪杰斯特拉算法):
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = ;
int n,m,a,b,d,p,s,t,dis[MAXN],cis[MAXN],cost[MAXN][MAXN],G[MAXN][MAXN];//dis数组记录当前节点离起点的最短路径,cis数组记录当前节点离起点的最小费用,cost数组和G数组分别记录费用和节点之间的关系
void Dijkstra(){
priority_queue< pair<int,int> > que;//最大堆优先队列
dis[s]=cis[s]=;//到自己的距离为0,且0花费
que.push(make_pair(-dis[s],s));//加上负号实现最大堆,便于取出最短路径
while(!que.empty()){
int k=que.top().second;//每次取出队首元素即最短路径
que.pop();//弹出队首元素
for(int i=;i<=n;++i){ //更新邻边权值最小的邻接点
if(dis[i]>dis[k]+G[k][i]){
cis[i]=cis[k]+cost[k][i];
dis[i]=dis[k]+G[k][i];
que.push(make_pair(-dis[i],i)); //如果有最小权值的邻接点,加入队列中去,记得加负号,因为这是最大堆
}
else if(dis[i]==dis[k]+G[k][i] && cis[i]>cis[k]+cost[k][i]) //如果当前多条最短路径,则取两者中较小费用
cis[i]=cis[k]+cost[k][i];
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m) && (m+n)){
for(int i=;i<=n;++i)
dis[i]=cis[i]=INF;//全部初始化为INF无穷大
for(int i=;i<=n;++i){
for(int j=;j<=n;++j)
if(i==j)G[i][j]=cost[i][j]=;//到自身的距离和费用都为0
else G[i][j]=cost[i][j]=INF;//其余初始化为INF
}
for(int i=;i<=m;++i){
scanf("%d %d %d %d",&a,&b,&d,&p);
if(G[a][b]>d){//预处理,考虑到重边的情况
G[a][b]=G[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if(G[a][b]==d && cost[a][b]>p)//如果a到b的距离等于原来的话,取最小费用
cost[a][b]=cost[b][a]=p;
}
scanf("%d %d",&s,&t);
Dijkstra();
printf("%d %d\n",dis[t],cis[t]);
}
return ;
}
题解报告: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] 最短路径问题 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 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- #HDU 3790 最短路径问题 【Dijkstra入门题】
题目: 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 3790 最短路径问题(迪杰斯特拉)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 3790 最短路径dijkstra(多重权值)
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
随机推荐
- Django 数据库操作之数据库连接
修改settings.py文件 """ Django settings for db_operation_demo project. Generated by 'djan ...
- 洛谷 2824 [HEOI2016/TJOI2016]排序
[题意概述] 对一个1到n的排列做m次区间排序,最后询问位置q上面的数. [题解] 区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求. 我们考虑二分答案.如果某个位置的数比 ...
- [luoguP2659] 美丽的序列(单调栈)
传送门 单调栈大水题 l[i] 表示 i 能扩展到的左边 r[i] 表示 i 能扩展到的右边 ——代码 #include <cstdio> #include <iostream> ...
- objective-c 通告
1. 通告和委托的区别 通告也能传递与事件相关的数据.通告不同于委托的地方在于,通告是在对象执行完成动作之后产生,而不是之前.受到通告的对象没有机会建议是否要执行动作,而且对象的通告可以有多个监听者( ...
- M - 小希的迷宫 并查集
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- - > 贪心基础入门讲解五——任务执行顺序
分析: 本题可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数. 针对本题a[i] = R[i], b[i] = R[i] – O[i],注意O[i] &l ...
- Ubuntu安装deb时错误:“dpkg:错误:另外一个进程已经为 dpkg 状态数据库 加锁”解决
以下方式任选一个即可: 1.重启系统 2.执行(这种方式不要尝试,系统很容易挂) sudo rm /var/lib/dpkg/lock 然后执行修复 sudo dpkg --configure -a
- ubuntu 16.04网卡找不到eth0
自15版本开始就不叫eth0.可以通过ifconfig进行查看: ifconfig -a 其中enp3s0才是网卡的名称,lo为环路. 参考: http://blog.csdn.net/christn ...
- CentosOS 7: 创建Nginx+Https网站
参考文章: 1. https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E 2. http://songchenwen.com/tech/ ...
- Sparql语言模型(一)
在进行RDF数据查询或描写叙述的时候.Sparql不管从出身.标准抑或操作习惯上都是一个不错的选择.然而对于一个刚開始学习的人来说多多少少有些"禁忌"的意味,操作起来也有点畏首畏尾 ...