九度oj 题目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
本来是一道很简单的迪杰特斯拉算法,一开始提交的代码如下#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#define MAX 103
#define inf 0x3f3f3f3f
int map[MAX][MAX];
bool flag[MAX]; int main(int argc, char const *argv[])
{
int n, m;
scanf("%d %d",&n,&m);
while(n != || m != ) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
map[i][j] = inf;
flag[i] = false;
}
} int a,b,c;
for(int i = ; i < m; i++) {
scanf("%d %d %d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
} flag[] = true;
int count = ;
while(count <= n) {
int min = MAX;
int mini = -;
for(int i = ; i <= n; i++) {
if(flag == false) {
if(map[][i] < min) {
min = map[][i];
mini = i;
}
}
}
map[][mini] = min;
flag[mini] = true;
for(int i = ; i <= n; i++) {
int dis = map[][mini] + map[mini][i];
if(dis < map[][i]) {
map[][i] = dis;
}
}
count++;
}
printf("%d\n",map[][n]);
scanf("%d %d",&n,&m);
}
return ;
}一开始百思不得其解究竟哪里做错了,只好先换一种写法
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#define MAX 103
#define inf 999999999
int map[MAX][MAX];
bool flag[MAX];
int lowCost[MAX]; int main(int argc, char const *argv[])
{
int n, m;
scanf("%d %d",&n,&m);
while(n != || m != ) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
map[i][j] = inf;
}
flag[i] = false;
} int a,b,c;
for(int i = ; i < m; i++) {
scanf("%d %d %d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
} flag[] = true;
for(int i = ; i <= n; i++) {
lowCost[i] = map[][i];
} for(int i = ; i <= n; i++) {
int min = inf;
int v = -;
for(int j = ; j <= n; j++) {
if(flag[j] == false && lowCost[j] < min) {
min = lowCost[j];
v = j;
}
}
flag[v] = true; for(int j = ; j <= n; j++) {
if(flag[j] == false && lowCost[v]+map[v][j] < lowCost[j]) {
lowCost[j] = lowCost[v]+map[v][j];
}
}
} printf("%d\n",lowCost[n]);
scanf("%d %d",&n,&m);
}
return ;
}后来经仔细排查,第一种写法的错误有两处,一是33行,min = inf
二是36行flag[i] ==false
另一种办法是使用Floyd算法,但开始我的代码是这样的
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#define MAX 103
#define inf 999999999
int map[MAX][MAX]; int main(int argc, char const *argv[])
{
int n, m;
scanf("%d %d",&n,&m);
while(n != || m != ) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
map[i][j] = inf;
}
} for (int i=; i<=n; ++i)
map[i][i] = ; int a,b,c;
for(int i = ; i < m; i++) {
scanf("%d %d %d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
} for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
for(int k = ; k <= n; k++) {
if (map[i][k] == inf || map[k][j] == inf)
continue;
if(map[i][k]+map[k][j] < map[i][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
printf("%d\n",map[][n]);
scanf("%d %d",&n,&m);
}
return ;
}但WA了,而真正的算法是这样的
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#define MAX 103
#define inf 999999999
int map[MAX][MAX]; int main(int argc, char const *argv[])
{
int n, m;
scanf("%d %d",&n,&m);
while(n != || m != ) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
map[i][j] = inf;
}
} int a,b,c;
for(int i = ; i < m; i++) {
scanf("%d %d %d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
} for(int k = ; k <= n; k++) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= n; j++) {
if (map[i][k] == inf || map[k][j] == inf)
continue;
if(i != j && map[i][k] + map[k][j] < map[i][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
printf("%d\n",map[][n]);
scanf("%d %d",&n,&m);
}
return ;
}注意算法是 先对中间点进行遍历,不断增加新的中间点以得到更优的答案
九度oj 题目1447:最短路的更多相关文章
- 九度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 ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- JavaScript之执行环境及作用域
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.我们编写的代码是无法访问这个对象的,但解 ...
- 【Web应用-网络连接】Azure Web 应用对外连接数上限分析
在 Azure Web 应用中发起大量外部连接操作时,需要考虑已经建立了多少外部连接.当超过最大对外连接数时,Azure Web 应用将会产生套接字异常.Azure Web 应用对于各个级别的实例,对 ...
- (五)mybatis之下载与基本构成
1. 下载MyBatis. 输入网址:https://github.com/mybatis/mybatis-3/releases 进入Mybatis下载页面,选择第一个选项,然后就可以加载到myba ...
- PHP 哈希表碰撞攻击
理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内定位到一个桶(术语bucket,表示哈希表中的一个位 ...
- 并查集+思维——Destroying Array
一.题目描述(题目链接) 给定一个序列,按指定的顺序逐一删掉,求连续子序列和的最大值.例如序列1 3 2 5,按3 4 1 2的顺序删除,即依次删除第3个.第4个.第1个.第2个,答案为5 4 3 0 ...
- 讲课笔记3——CSS
背景常见样式: width:600px; height:800px; background: url(bg.jpg) no-repeat 40px 20px fixed gray ; * ...
- kmp 模板
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> ...
- How to debug add-ins for arcgis
Debugging add-ins To debug an add-in, follow these steps: Confirm that the add-in is deployed to the ...
- react native在xcode真机调试ios
1修改URL地址:打开项目目录下的AppDelegate.m文件,修改里面的URL,把localhost改为你的电脑的IP.在Mac系统下,你可以在系统设置/网络里找到电脑的IP地址. 2选择设备:把 ...
- (5)JSTL的xml标签库
Jstl的XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容. <%@ taglib uri="h ...