hdu 3790 最短路径问题(双重权值,dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790
题目大意:题意明了,输出最短路径及其花费。
需要注意的几点:(1)当最短路径相同时,输出最小花费!!!
(2)更新路径的时候要注意更新花费。
#include <iostream>
#include <cstdio>
using namespace std;
const int INF=;
int map[][],Min,n,cost[][],node[],vis[];
int pr[]; void set()
{
for (int i=; i<=n; i++)
{
vis[i]=;
node[i]=INF;
pr[i]=INF;
for (int j=; j<=n; j++)
{
map[i][j]=INF;
cost[i][j]=INF;
}
}
} void dijkstra(int m)
{
int tm=m;
vis[m]=;
node[m]=;
pr[m]=;
for (int k=; k<=n; k++)
{
Min=INF;
int M=INF;
for (int i=; i<=n; i++)
if(!vis[i])
{
if (node[i]>map[tm][i]+node[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
else if(node[i]==map[tm][i]+node[tm])
{
if(pr[i]>cost[tm][i]+pr[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
}
if (Min>node[i])
{
M=pr[i];
Min=node[i];
m=i;
}
else if (Min==node[i])
{
if(M>pr[i])
{
M=pr[i];
Min=node[i];
m=i;
}
}
}
vis[m]=;
tm=m;
}
} int main ()
{
int a,b,d,p,m;
while(scanf("%d%d",&n,&m),n||m)
{
set();
while (m--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (map[a][b]>d)
{
cost[a][b]=cost[b][a]=p;
map[a][b]=map[b][a]=d;
}
else if (map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&a,&b);
dijkstra(a);
printf ("%d %d\n",node[b],pr[b]);
}
}
一种简单明了的代码。
#include <iostream>
#include <cstdio> using namespace std; const int INF=; int Map[][],Min,Mmin,n,cost[][],node[],vis[];
int pr[],tm; void sett()
{
for (int i=; i<=n; i++)
{
node[i]=INF;
vis[i]=;
pr[i]=INF;
for (int j=; j<=n; j++)
{
Map[i][j]=INF;
cost[i][j]=INF;
}
}
} int dijkstra()
{
for (int i=; i<=n; i++)
{
Min=INF;
Mmin=INF;
for (int j=; j<=n; j++)
{
if (!vis[j])
{
if (Min>node[j])
{
Min=node[j];
Mmin=pr[j];
tm=j;
}
else if (Min==node[j])
{
if (Mmin>pr[j])
{
Mmin=pr[j];
tm=j;
}
}
}
}
vis[tm]=;
for (int j=; j<=n; j++)
if (!vis[j])
{
if (node[j]>Map[tm][j]+node[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
else if (node[j]==Map[tm][j]+node[tm])
{
if (pr[j]>cost[tm][j]+pr[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
}
}
}
} int main ()
{
int m,a,b,d,p,s,t;
while (~scanf("%d%d",&n,&m))
{
if (n==&&m==)
break;
sett();
for (int i=; i<=m; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (Map[a][b]>d)
{
Map[a][b]=Map[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if (Map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&s,&t);
node[s]=;
pr[s]=;
dijkstra();
printf ("%d %d\n",node[t],pr[t]);
}
}
hdu 3790 最短路径问题(双重权值,dijkstra算法)的更多相关文章
- HDU 3790(两种权值的迪杰斯特拉算法)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu-3790 最短路径问题(双重权值)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input ...
- 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 1874 畅通工程续(初涉dijkstra算法实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...
- HDU-3790 最短路径问题(双重权值)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- 题解报告:hdu 3790 最短路径问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...
- hdu 1565&hdu 1569(网络流--最小点权值覆盖)
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU - 5592 ZYB's Premutation (权值线段树)
题意:给出序列前k项中的逆序对数,构造出这个序列. 分析:使用权值线段树来确定序列元素. 逆序对的数量肯定是递增的,从最后一个元素开始逆向统计,则\(a[i] - a[i-1]\)即位置i之前比位置i ...
随机推荐
- tomcat web页面管理应用配置
大部分时候,我们的tomcat服务器都不是部署在本机,那么怎么样不通过ftp/sftp方式来将war包部署到tomcat容器呢? tomcat有提供web页面管理应用的功能. 我们来看看怎么配置实现该 ...
- Github Atom汉化方式
1.下载:Atom https://atom.io/ 2.安装 3.菜单栏 -- Setting --- Install --- 搜索Chinese --安装汉化包 4.重启 生效.
- 如何用grep命令同时显示匹配行上下的n行 (美团面试题目)
标准unix/linux下的grep通过以下参数控制上下文 grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行grep -B 5 foo file 显示foo及前5 ...
- 异步执行任务SimpleAsyncTaskExecutor详解
SimpleAsyncTaskExecutor 异步执行用户任务的SimpleAsyncTaskExecutor.每次执行客户提交给它的任务时,它会启动新的线程,并允许开发者控制并发线程的上限(con ...
- RT-thread内核之事件
一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...
- BZOJ 1491 社交网络(最短路)
对于这道题,如果我们能求出s到t的最短路径数目和s由v到t的最短路径数目,剩下的很好求了. 令dis[i][j]表示i到j的最短路径,dp[i][j]表示i到j的最短路径条数,如果dis[s][v]+ ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
- HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)
HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值) 点我挑战题目 题意分析 从题目中可以看出是大数据的输入,和大量询问.基本操作有: 1.Q(i,j)代表求区间max(a ...
- HDU 2083(排序+绝对值+中间值求和)
简易版之最短距离 点我跳转到HDOJ Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- windows内存映射文件
http://shushanyegui.duapp.com/?p=731 在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序 #include "stdafx.h&q ...