HDU 3790 最短生成树 (最短路)
Problem Description
给你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
分析:
简单的最短路径问题,但是我们需要额外考虑的就是,最短路径可能不止一条,所以在找到最短路径的同时,还要保证花费最少。
代码
#include<stdio.h>
#include<string.h>
using namespace std;
#define inf 0x1f1f1f1f
int a[1005][1005];///路径长度
int b[1005][1005];///花费
int d[1005];
int p[1005];
int v[1005];
int n,m;
void init(int n)///初始化
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
a[i][j]=inf;
b[i][j]=inf;
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0||m==0)break;
init(n);
int x,y,z,q;
for(int i=0; i<m; i++)
{
scanf("%d%d%d%d",&x,&y,&z,&q);
if(a[x][y]==inf)///还没有路径,直接赋值
{
a[x][y]=a[y][x]=z;
b[x][y]=b[y][x]=q;
}
else
{
if(a[x][y]>z||a[x][y]==z&&b[x][y]>q)///原来有路径,但是路径长;或则路径虽然一样,但是花费多
{
a[x][y]=a[y][x]=z;
b[x][y]=b[y][x]=q;
}
}
}
int s,t;
scanf("%d%d",&s,&t);
memset(v,0,sizeof(v));
memset(p,0,sizeof(p));
for(int i=1; i<=n; i++)
{
d[i]=inf;
p[i]=inf;
}
//要点1 初始化起点为0.
/*zhongdian*/d[s]=0;///路径
/*zhongdian*/p[s]=0;///花费
//表示s是起点
for(int i=1; i<=n; i++) ///我们将要所有点.
{
int w,m=inf,t;
for(int j=1; j<=n; j++)
{
if(v[j]==0&&d[j]<m)///先找到目前最短路径~
{
w=j;
m=d[j];
t=p[j];
}
if(v[j]==0&&d[j]==m&&p[j]<t)///再找到最短的花费
{
w=j;
m=d[j];
t=p[j];
}
}
v[w]=1;///做标记,表明你这个点已经走过
for(int j=1; j<=n; j++)
{
if(d[w]+a[w][j]<d[j])///到j的路径能够通过当前最短路径进行权值压缩.就要进行压缩
{
d[j]=d[w]+a[w][j];
p[j]=p[w]+b[w][j];
}
if(d[w]+a[w][j]==d[j])
{
if(p[j]>p[w]+b[w][j])
{
p[j]=p[w]+b[w][j];
}
}
}
}
printf("%d %d\n",d[t],p[t]);
}
}
HDU 3790 最短生成树 (最短路)的更多相关文章
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- 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 有两个条件:距离和花费.首先要求距离最短,距离相等的条件下花费最小. 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,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. ...
- hdu 3790 最短路径问题(最短路,Dijsktra)
题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...
- HDU 3790 (最短路 + 花费)
题意: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. #include<bits/stdc ...
随机推荐
- C#控件之Repeater控件使用
歡迎大家來討論,修改,一定虛心接受. 1.為什麼使用Repeater控件? 關於把從數據庫讀取的數據綁定到前台頁面,我們可以使用DataGrid.DataGridView以及Repeater來佈局,三 ...
- ajax跨域问题(三种解决方案)
为什么会出现跨域 跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其 ...
- C#获取当前路径的方法如下
1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. System.Environm ...
- Maven 私服安装和启动
在安装私服的时候容易碰到的两个问题,一个是安装时拒绝访问,另一个是安装完成后服务无法启动: 拒绝访问问题: 原因:没有以管理员身份运行 cmd 解决办法: 如果是 win7 的话,可以直接在 [运行- ...
- 创建Django的App
一. 新建1个App,命令:python manage.py startapp lib 1. 打开终端 2. 新建 3. 把业务代码放到每一个APP里面就更专业了. 修改urls里面的代码如下: 运行 ...
- xpose修改手机imei码,注入广告
何为hook Hook英文翻译过来就是“钩子”的意思,那我们在什么时候使用这个“钩子”呢? 我们知道,在Android操作系统中系统维护着自己的一套事件分发机制.应用程序,包括应用触发事件和后台逻 ...
- 使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)
随着Unity5.1的发布,之前的Oculus Rift和Gear VR 开发流程发生了巨大的变化,这也算是小白鼠们必须付出的代价了~ 那么Unity5.1和Oculus的整合究竟发生了哪些变化,对开 ...
- Linux用户创建及权限管理
作业一: 1,新建用户natasha,uid为1000,gid为555,备注信息为“master” useradd natasha vim /etc/passwd ...
- Codeforces 932.E Team Work
E. Team Work time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- STL源码分析-rotate
http://note.youdao.com/noteshare?id=4ba8ff81aa96373ba11f1b82597ec73a