九度OJ 1008:最短路径问题 (最短路)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:8064
解决:2685
- 题目描述:
-
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
- 输入:
-
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
- 输出:
-
输出 一行有两个数, 最短距离及其花费。
- 样例输入:
-
3 2
1 2 5 6
2 3 4 5
1 3
0 0
- 样例输出:
-
9 11
思路:
典型最短路径问题,通常有两种方法:Dijkstra和floyd算法。我比较喜欢用前一种。
最短路径算法的介绍可参见博客:http://blog.csdn.net/damenhanter/article/details/24771913
本题除了最短路径,还加上了花费,其实原理一样的。
代码:
#include <stdio.h> #define N 1000
#define INF 1000000000 int D[N][N], P[N][N];
int visit[N], dis[N], pay[N]; void init(int n)
{
for (int i=0; i<n; i++)
{
visit[i] = 0;
for (int j=0; j<n; j++)
{
D[i][j] = INF;
P[i][j] = INF;
}
}
} void printdis(int n)
{
int i;
for (i=0; i<n-1; i++)
printf("%d ", dis[i]);
printf("%d\n", dis[i]);
} void dijkstra(int s, int n)
{
int i, j;
for (i=0; i<n; i++)
{
dis[i] = D[s][i];
pay[i] = P[s][i];
}
dis[s] = 0;
pay[s] = 0;
visit[s] = 1;
//printdis(n); int mind, minp;
int k;
for (i=0; i<n; i++)
{
mind = INF;
minp = INF;
for (j=0; j<n; j++)
{
if ( !visit[j] && (dis[j]<mind
|| dis[j]==mind && pay[j]<minp) )
{
mind = dis[j];
minp = pay[j];
k = j;
}
}
visit[k] = 1;
for (j=0; j<n; j++)
{
if ( !visit[j] && (dis[k]+D[k][j] < dis[j]
|| dis[k]+D[k][j] == dis[j] && pay[k]+P[k][j] < pay[j]) )
{
dis[j] = dis[k]+D[k][j];
pay[j] = pay[k]+P[k][j];
}
}
}
//printdis(n);
} int main(void)
{
int n, m, i;
int a, b, d, p;
int s, t; while (scanf("%d%d", &n, &m) != EOF)
{
if (n == 0 && m == 0)
break; init(n);
for(i=0; i<m; i++)
{
scanf("%d%d%d%d", &a, &b, &d, &p);
D[a-1][b-1] = D[b-1][a-1] = d;
P[a-1][b-1] = P[b-1][a-1] = p;
}
scanf("%d%d", &s, &t); dijkstra(s-1, n);
printf("%d %d\n", dis[t-1], pay[t-1]);
} return 0;
}
/**************************************************************
Problem: 1008
User: liangrx06
Language: C
Result: Accepted
Time:20 ms
Memory:8736 kb
****************************************************************/
九度OJ 1008:最短路径问题 (最短路)的更多相关文章
- [九度OJ]1008.最短路径问题
原题链接:http://ac.jobdu.com/problem.php?pid=1008 题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离 ...
- 九度oj 题目1447:最短路
题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
随机推荐
- Codeforces 323C Two permutations
题目描述 You are given two permutations pp and qq , consisting of nn elements, and mm queries of the for ...
- IOS 开发之 Method Swizzling
ios 分类中如果增加的方法与被扩展的类方法名重复,则原方法就没法被调用….看以下例子 例如: @interface ClassA : NSObject - (NSString *) myMethod ...
- Android图片突出
概述 今天有个群友问 Android 图片凸出 效果怎么弄,早以前有过类似的需求,整个项目的提示框都是一个背景,背景上方有凸出半张图片,所以用layer-list写了一个背景来实现. 思路 随便画了一 ...
- web.xml文件的 xsd引用(或dtd引用)学习
1. 为什么web.xml会有不同版本的xsd引用: JDK依赖变化: 或 servlet(JAVA EE)自身API的改变: 2. 为什么会有dtd和xsd两个版本的区别 我是在这篇文章中看到的,作 ...
- sublime的markdown插件
mac安装 shift+command+p调出package control面板,搜索install调查安装软件搜索面板 搜索需要安装markdown软件 我安装了下面两个:MarkdownLiveP ...
- glsl镜面水倒影的实现[转]
http://blog.sina.com.cn/s/blog_78ea87380101ejbf.html 使用两相机,一个master相机, 主要负责场景的渲染, 另一个rtt相机, 和master相 ...
- eclipse学习
网上转载,以作以后学习之用! eclipse学习 关键字: eclipse学习 1 eclipse插件安装方法(link方法) 一般插件包含一个eclipse目录,其下是features和plugin ...
- Cocos2d-x 更改文字换行风格 ( cocos2dx change line )
Cocos2dx change line 在 cocos2dx change line 的实现中,我们能够简单的使用 dimensions属性控制换行.使用它仅仅需将相应的參数值传入构造函数,或者调用 ...
- Nginx在windows2003下的使用 PHP
nginx真正能够发挥其良好的负载能力的,是在linux下. 我们在windows下搭建好环境,测试开发使用.强烈建议在linux下开发的. ---- 下载nginx 访问www.nginx.org, ...
- HBase——完全分布
实际上,在真实环境中你需要使用完全分布配置完整测试HBase.在一个分布式配置中,集群有多个节点,每个节点运行一个或多个HBase守护进程.其中包括主Master和备份Master实例,多个Zooke ...