九度OJ 1447 最短路 1008 最短路径问题
题目地址:http://ac.jobdu.com/problem.php?pid=1447
题目描述:
-
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
- 输入:
-
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
当输入为两个0时,输入结束。
- 输出:
-
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。
- 样例输入:
-
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
- 样例输出:
-
3
2
Floyd算法:
#include <stdio.h>
#include <limits.h> void Init (int graph[101][101], int N){
int i;
int j;
for (i=1; i<=N; ++i){
for (j=1; j<=N; ++j){
graph[i][j] = INT_MAX;
}
}
for (i=1; i<=N; ++i)
graph[i][i] = 0;
} void Floyd (int graph[101][101], int N){
int i;
int j;
int k;
for (k=1; k<=N; ++k){
for (i=1; i<=N; ++i){
for (j=1; j<=N; ++j){
if (graph[i][k] == INT_MAX || graph[k][j] == INT_MAX)
continue;
if (graph[i][j] > graph[i][k] + graph[k][j])
graph[i][j] =graph[i][k] + graph[k][j];
}
}
}
} int main(void){
int N;
int M;
int graph[101][101];
int start;
int end;
int length; while (scanf ("%d%d", &N, &M) != EOF && N != 0 && M != 0){
Init (graph, N);
while (M-- != 0){
scanf ("%d%d%d", &start, &end, &length);
graph[start][end] = length;
graph[end][start] = length;
}
Floyd (graph, N);
printf ("%d\n", graph[1][N]);
} return 0;
}
题目地址:http://ac.jobdu.com/problem.php?pid=1008
- 题目描述:
-
给你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算法:
1、邻接矩阵:
#include <stdio.h>
#include <limits.h> #define MAXN 1001 typedef struct road{
int len;
int cost;
}Road; void Init (Road graph[MAXN][MAXN], Road minlength[MAXN],int n){
int i, j;
for (i=1; i<=n; ++i){
for (j=1; j<=n; ++j){
graph[i][j].len = INT_MAX;
graph[i][j].cost = INT_MAX;
}
}
for (i=1; i<=n; ++i){
graph[i][i].len = 0;
graph[i][i].cost = 0;
minlength[i].len = INT_MAX;
minlength[i].cost = INT_MAX;
}
} void Dijkstra (Road graph[MAXN][MAXN], Road minlength[MAXN], int N, int s, int t){
int visited[MAXN];
int i;
int node;
int reminder;
int minlen;
int mincost;
int index; for (i=1; i<=N; ++i)
visited[i] = 0;
visited[s] = 1;
minlength[s].len = 0;
minlength[s].cost = 0;
reminder = N - 1;
node = s;
while (reminder-- != 0){
for (i=1; i<=N; ++i){
if (graph[node][i].len == INT_MAX || graph[node][i].len == 0)
continue;
else{
if ((minlength[node].len + graph[node][i].len < minlength[i].len) ||
((minlength[node].len + graph[node][i].len == minlength[i].len) &&
(minlength[node].cost + graph[node][i].cost < minlength[i].cost))){
minlength[i].len = minlength[node].len + graph[node][i].len;
minlength[i].cost = minlength[node].cost + graph[node][i].cost;
}
}
}
minlen = INT_MAX;
mincost = INT_MAX;
for (i=1; i<=N; ++i){
if (visited[i] == 0 ){
if (minlength[i].len < minlen || (minlength[i].len == minlen &&
minlength[i].cost < mincost)){
minlen = minlength[i].len;
mincost = minlength[i].cost;
index = i;
}
}
}
visited[index] = 1;
node = index;
}
} int main(void){
int n, m;
int a, b, d, p;
int s, t;
Road graph[MAXN][MAXN];
Road minlength[MAXN]; while (scanf ("%d%d", &n, &m) != EOF && n != 0 && m != 0){
Init (graph, minlength, n);
while (m-- != 0){
scanf ("%d%d%d%d", &a, &b, &d, &p);
graph[a][b].len = d;
graph[a][b].cost = p;
graph[b][a].len = d;
graph[b][a].cost = p;
}
scanf ("%d%d", &s, &t);
Dijkstra (graph, minlength, n, s, t);
printf ("%d %d\n", minlength[t].len, minlength[t].cost);
} return 0;
}
2、邻接表:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> #define MAXN 1001 typedef struct edge{
int end;
int len;
int cost;
struct edge * next;
}Edge; typedef struct vertex{
int start;
struct edge * next;
}Vertex; typedef struct road{
int len;
int cost;
}Road; void Init (Vertex graph[MAXN], Road minlength[MAXN], int n){
int i;
for (i=1; i<=n; ++i){
graph[i].start = i;
graph[i].next = NULL;
minlength[i].len = INT_MAX;
minlength[i].cost = INT_MAX;
}
} void Insert (Vertex graph[MAXN], int start, int end, int len, int cost){
Edge * t = graph[start].next;
Edge * pre = NULL;
Edge * p = NULL;
while (t != NULL && t->end != end){
pre = t;
t = t->next;
}
if (t == NULL){
p = (Edge *)malloc(sizeof(Edge));
p->end = end;
p->len = len;
p->cost = cost;
p->next = NULL;
if (pre != NULL)
pre->next = p;
else
graph[start].next = p;
}
else{
if (len < t->len || (len == t->len && cost < t->cost)){
t->len = len;
t->cost = cost;
}
}
} void Dijkstra (Vertex graph[MAXN], Road minlength[MAXN], int N, int start, int end){
int visited[MAXN];
int i;
int node;
int reminder;
int minlen;
int mincost;
int index;
Edge * p = NULL;
Edge * q = NULL; for (i=1; i<=N; ++i)
visited[i] = 0;
visited[start] = 1;
minlength[start].len = 0;
minlength[start].cost = 0;
reminder = N - 1;
node = start;
while (reminder-- != 0 && node != end){
p = graph[node].next;
while (p != NULL){
if ((p->len + minlength[node].len < minlength[p->end].len) ||
((p->len + minlength[node].len == minlength[p->end].len) &&
(p->cost + minlength[node].cost < minlength[p->end].cost))){
minlength[p->end].len = p->len + minlength[node].len;
minlength[p->end].cost = p->cost + minlength[node].cost;
}
p = p->next;
}
minlen = INT_MAX;
mincost = INT_MAX;
for (i=1; i<=N; ++i){
if (visited[i] == 0 ){
if (minlength[i].len < minlen || (minlength[i].len == minlen &&
minlength[i].cost < mincost)){
minlen = minlength[i].len;
mincost = minlength[i].cost;
index = i;
}
}
}
visited[index] = 1;
node = index;
}
} int main(void){
int n, m;
int a, b, d, p;
int s, t;
Vertex graph[MAXN];
Road minlength[MAXN]; while (scanf ("%d%d", &n, &m) != EOF && n != 0 && m != 0){
Init (graph, minlength, n);
while (m-- != 0){
scanf ("%d%d%d%d", &a, &b, &d, &p);
Insert (graph, a, b, d, p);
Insert (graph, b, a, d, p);
}
scanf ("%d%d", &s, &t);
Dijkstra (graph, minlength, n, s, t);
printf ("%d %d\n", minlength[t].len, minlength[t].cost);
} return 0;
}
九度OJ 1447 最短路 1008 最短路径问题的更多相关文章
- 九度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 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- mac svn的替代品CornerStone
推荐mac CornerStone客户端图形软件,类似windows下svn tortoise. 一.下载地址 : http://bbs.feng.com/read-htm-tid-7936664.h ...
- 如何关闭UINavigationController 向右滑动 返回上一层视图
说明一下: 我的nav 设置的rootview 是 tabbarcontroller,登录界面是push进去的,所以,在登录界面,如果靠近最左边 向右滑动 会出现 tabbarcontroller的视 ...
- Oracle 11g系统自己主动收集统计信息的一些知识
在11g之前,当表的数据量改动超过总数据量的10%,就会晚上自己主动收集统计信息.怎样推断10%.之前的帖子有研究过:oracle自己主动统计信息的收集原理及实验.这个STALE_PERCENT=10 ...
- JS 实现2+2=5的代码 实现原理解析
当我在http://segmentfault.com/q/1010000000531302 看到的时候 先是一惊. 这是代码 g = function () { H = 3 return H ...
- http的get与post方式下的getParameter获取中文
客户端提交某个中文参数,比如a=中国 (1)如果以GET方式提交,在地址栏中,可以看到参数进行了URL ENCODE,形如:a=%E4%B8%AD%E5%9B%BD.服务端接收到请求,使用reques ...
- ios开发——笔记篇
:开关 BOOL isopen = !isopen; //View @property (nonatomic, assign) BOOL open;//模型属性 self.group.open = ! ...
- Swift概览
<pre name="code" class="objc">转自:http://letsswift.com/2014/06/swift_overvi ...
- 数据结构与算法分析(2)——表、栈和队列
抽象数据类型 抽象数据类型(ADT)是一系列操作的集合.诸如表.集合.图和他们的操作一起可以看做是抽象数据类型 表 List 表的实现有两种:数组和链表.数组实现的表在插入和删除操作上的花 ...
- 我的开发框架(WinForm)2
上篇文章简单的介绍了一下,我的一个开发框架.看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的. Data模块: 该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(C ...
- java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序
过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...