终于AC了“最短路径”
今天做了一道关于最短路径的算法题,虽然最后AC了,但是我写的第一个算法,我认为是没有问题的,自己编写的测试用例也全部通过,反复调试了,都没有错误。可是在OJ上一提交就提示Wrong Answer,真是苦闷啊!希望看到这篇文章的同志们给些提示。
两个算法都是用邻接表存储图的,都是比较纯粹的自定义结构体,使用的是DijkStra算法。虽然用容器也可以实现邻接表,但是个人感觉用结构体是比较简单,可以不用了解底层的实现。但是本人就是喜欢钻研一些基础的东西,无它,兴趣使然。
- 题目描述:
-
给你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
第一个算法---为啥子错撒?
#include <iostream>
#include <malloc.h>
#define MAXVALUE 999999;
#define MAX_VERTEX_NUM 1001
#define MAX_EDGE_NUM 100001
using namespace std; struct ArcNode{
int vertex;
int len;
int cost;
ArcNode *nextarc;
}; typedef struct VertexNode{
ArcNode *firstArc;
int size;
}VNode[MAX_VERTEX_NUM]; struct Graph{
VNode nodes;
int n, e;
};
int dist[MAX_VERTEX_NUM];
int cost[MAX_VERTEX_NUM];
bool visited[MAX_VERTEX_NUM];
//Edge edges[MAX_EDGE_NUM];
void allocateArcNode(ArcNode** arcNode)
{
*arcNode = (ArcNode*)malloc(sizeof(ArcNode));
(*arcNode)->nextarc = NULL;
} void initeGraph(Graph &graph)
{
for (int i = ; i <= MAX_VERTEX_NUM; i++)
{
graph.nodes[i].firstArc = NULL;
graph.nodes[i].size = ;
} graph.n = ;
graph.e = ;
} void createGraph(Graph &graph, int m)
{
int v1, v2, len, cost;
ArcNode* p1 = NULL;
ArcNode* p2 = NULL;
for (int i = ; i <= m; i++)
{
allocateArcNode(&p1);
allocateArcNode(&p2);
cin >> v1 >> v2 >> len >> cost;
p1->vertex = v2;
p1->len = len;
p1->cost = cost;
p1->nextarc = graph.nodes[v1].firstArc;
graph.nodes[v1].firstArc = p1;
graph.nodes[v1].size++;
p2->vertex = v1;
p2->len = len;
p2->cost = cost;
p2->nextarc = graph.nodes[v2].firstArc;
graph.nodes[v2].firstArc = p2;
graph.nodes[v2].size++;
}
} //void printGraph(const Graph& graph, int n)
//{
// for (int i = 1; i <= n; i++)
// {
// ArcNode* arcPtr = graph.nodes[i].firstArc;
//
// cout << i << ": ";
// cout << "size:" << graph.nodes[i].size << endl;
// while (arcPtr != NULL)
// {
// cout << arcPtr->len << ' ' << arcPtr->cost << ";";
// arcPtr = arcPtr->nextarc;
// }
//
// cout << endl;
// }
//} void dijkStra(const Graph &graph, int v0, int n)
{
int index = v0;
for (int i = ; i <= n; i++)
{
ArcNode *arcPtr = graph.nodes[index].firstArc;
while (arcPtr != NULL)
{
int tmp = arcPtr->vertex;
int len = arcPtr->len;
int co = arcPtr->cost;
if (visited[tmp] == false || dist[tmp] > dist[index] + len || (dist[tmp] == dist[index] + len && cost[tmp] > cost[index] + co))
{
dist[tmp] = arcPtr->len;
cost[tmp] = arcPtr->cost;
}
arcPtr = arcPtr->nextarc;
}
int minLen = MAXVALUE;
int minCost = MAXVALUE;
for (int j = ; j <= n; j++)
{
if (visited[j] == false && (dist[j] < minLen || (dist[j] == minLen && cost[j] < minCost)))
{
minLen = dist[j];
index = j;
}
}
visited[index] = true;
}
} void freeSpaceOfGraph(Graph& graph)
{
for (int i = ; i <= graph.n; i++)
{
ArcNode *arcPtr = graph.nodes[i].firstArc;
while (arcPtr != NULL)
{
ArcNode *tmp = arcPtr;
arcPtr = arcPtr->nextarc;
delete tmp;
}
}
} int main()
{
int n, m; while (cin >> n >> m)
{
if (n == && m == )
break;
int start, end; for (int i = ; i <= n; i++)
{
visited[i] = false;
cost[i] = MAXVALUE;
dist[i] = MAXVALUE;
} Graph graph;
initeGraph(graph);
graph.n = n;
graph.e = m;
createGraph(graph, m);
cin >> start >> end;
dijkStra(graph, start, n);
cout << dist[end] << ' ' << cost[end] << endl;
freeSpaceOfGraph(graph);
}
return ;
}
第二算法---完美AC
#include <iostream>
#include <malloc.h>
#define MAXVALUE 123123123
#define MAX_VERTEX_NUM 1001
#define MAX_EDGE_NUM 100001
using namespace std; struct ArcNode{
int vertex;
int len;
int cost;
ArcNode *nextarc;
}; typedef struct VertexNode{
ArcNode *firstArc;
int size;
}VNode[MAX_VERTEX_NUM]; struct Graph{
VNode nodes;
int n, e;
};
int dist[MAX_VERTEX_NUM];
int cost[MAX_VERTEX_NUM];
bool visited[MAX_VERTEX_NUM];
//Edge edges[MAX_EDGE_NUM];
void allocateArcNode(ArcNode** arcNode)
{
*arcNode = (ArcNode*)malloc(sizeof(ArcNode));
(*arcNode)->nextarc = NULL;
} void initeGraph(Graph &graph)
{
for (int i = ; i <= MAX_VERTEX_NUM; i++)
{
graph.nodes[i].firstArc = NULL;
graph.nodes[i].size = ;
} graph.n = ;
graph.e = ;
} void createGraph(Graph &graph, int m)
{
int v1, v2, len, cost;
ArcNode* p1 = NULL;
ArcNode* p2 = NULL;
for (int i = ; i <= m; i++)
{
allocateArcNode(&p1);
allocateArcNode(&p2);
cin >> v1 >> v2 >> len >> cost;
p1->vertex = v2;
p1->len = len;
p1->cost = cost;
p1->nextarc = graph.nodes[v1].firstArc;
graph.nodes[v1].firstArc = p1;
graph.nodes[v1].size++;
p2->vertex = v1;
p2->len = len;
p2->cost = cost;
p2->nextarc = graph.nodes[v2].firstArc;
graph.nodes[v2].firstArc = p2;
graph.nodes[v2].size++;
}
} //void printGraph(const Graph& graph, int n)
//{
// for (int i = 1; i <= n; i++)
// {
// ArcNode* arcPtr = graph.nodes[i].firstArc;
//
// cout << i << ": ";
// cout << "size:" << graph.nodes[i].size << endl;
// while (arcPtr != NULL)
// {
// cout << arcPtr->len << ' ' << arcPtr->cost << ";";
// arcPtr = arcPtr->nextarc;
// }
//
// cout << endl;
// }
//} void dijkStra(const Graph &graph, int v0, int n)
{
int index = v0;
dist[v0] = ;
cost[v0] = ;
visited[v0] = true;
for (int i = ; i <= n; i++)
{
ArcNode *arcPtr = graph.nodes[index].firstArc;
while (arcPtr != NULL)
{
int tmp = arcPtr->vertex;
int len = arcPtr->len;
int co = arcPtr->cost;
if ((visited[tmp] == false) && (dist[tmp] > dist[index] + len
|| (dist[tmp] == dist[index] + len && cost[tmp] > cost[index] + co)))
{
dist[tmp] = dist[index] + len;
cost[tmp] = cost[index] + co;
}
arcPtr = arcPtr->nextarc;
}
int minLen = MAXVALUE;
int minCost = MAXVALUE;
for (int j = ; j <= n; j++)
{
if (visited[j] == true || dist[j] == MAXVALUE)
continue;
if (dist[j] < minLen || (dist[j] == minLen && cost[j] < minCost))
{
minLen = dist[j];
minCost = cost[j];
index = j;
}
}
visited[index] = true;
}
} void freeSpaceOfGraph(Graph& graph)
{
for (int i = ; i <= graph.n; i++)
{
ArcNode *arcPtr = graph.nodes[i].firstArc;
while (arcPtr != NULL)
{
ArcNode *tmp = arcPtr;
arcPtr = arcPtr->nextarc;
delete tmp;
}
}
} int main()
{
int n, m; while (cin >> n >> m)
{
if (n == && m == )
break;
int start, end; for (int i = ; i <= n; i++)
{
visited[i] = false;
cost[i] = MAXVALUE;
dist[i] = MAXVALUE;
} Graph graph;
initeGraph(graph);
graph.n = n;
graph.e = m;
createGraph(graph, m);
cin >> start >> end;
dijkStra(graph, start, n);
cout << dist[end] << ' ' << cost[end] << endl;
freeSpaceOfGraph(graph);
}
return ;
} /**************************************************************
Problem: 1008
User: 凌月明心
Language: C++
Result: Accepted
Time:10 ms
Memory:1528 kb
****************************************************************/
终于AC了“最短路径”的更多相关文章
- PAT 甲级 1010 Radix (25)(25 分)进制匹配(听说要用二分,历经坎坷,终于AC)
1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...
- NYOJ-79 拦截导弹 AC 分类: NYOJ 2014-01-01 23:25 167人阅读 评论(0) 收藏
#include<stdio.h> int main(){ int num[1000]={0}; int n,m,x,y; scanf("%d",&n); wh ...
- hdu 4878 ZCC loves words AC自动机+中国剩余定理+快速幂
题意就不说了. 分析:折腾好几天自己写的代码还是看了别人代码后发现几乎没什么复杂度的差别,可是就是一直超时,后来干脆照着别人写啊,一直WA,就在准备放弃干脆先写这篇博客的时候,又看了一眼WA的代码,发 ...
- 记一个问题的AC
今天突然做一道LCT的染色问题的时候突然想到一个两个月前一道没有AC的题目. 链接 大意是,给一个长度为10^4的序列,最多有255个不同的数字,有最多10^5次方个询问,对于每个询问 l,r 输出[ ...
- hdu 4117 GRE Words (ac自动机 线段树 dp)
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...
- 最短路径问题的Dijkstra算法
问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树> ...
- 【BZOJ】1030: [JSOI2007]文本生成器(AC自动机+dp)
题目 传送门:QWQ 传送到洛谷QWQ 分析 我一开始也不会做这题的,后来看了很多网上的题解,终于AC了.(我好菜啊) 主要参考:传送门QWQ 直接搞非常麻烦,反正我是不会做.于是考虑求反,即求有多少 ...
- NOIP2014提高组 DAY1 -SilverN
T1 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的 ...
- 126. Word Ladder II
题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...
随机推荐
- js检查页面上有无重复id的代码分享
用js代码检查一个页面上是否用重复的id. 方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...
- compiled inline cache
http://cr.openjdk.java.net/~jrose/pres/200910-VMIL.pdf https://wiki.openjdk.java.net/display/HotSpot ...
- 每日英语:Prosecutors Wrap Up Case Against Bo
Prosecutors wrapped up their case against Bo Xilai on Sunday, sparring with the defiant former Commu ...
- win32串口编程
翻译自:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WIN32COM.v10.en/dnfiles/html/msdn_serial.htm 老外写的文章, ...
- ClouderaManager之CDH-LZO配置
CDH-LZO配置 下载和CDH版本对应的hadoop-lzo版本 如下: 下载地址:http://archive.cloudera.com/gplextras5/parcels/ 需要下载如下三个文 ...
- eclipse ant 的自动部署(autobulid)
在写项目中,经常需要在 ctrl+s的时候自动编译并且把这个改动的文件copy至某个目录,除了eclipse自带 java脚本的web自动部署到项目中配置的目录下,但是不能随心所欲copy,比如其他文 ...
- c++包管理工具conan
Conan is a portable package manager, intended for C and C++ developers, but it is able to manage bui ...
- iOS--崩溃日志的格式化分析---格式化crash日志
工作中难免或碰到crash,如果是开发环境,碰到简单的crash还能重现下,如果不能重现的话,我们只能去分crash文件了. 首先看下面的crash问题,说句实话一看这个我是拒绝的,这怎么找原因啊,头 ...
- 实战c++中的vector系列--构造、operator=和assign差别
vector或许是实际过程中使用最多的stl容器.看似简单,事实上有非常多技巧和陷阱. 着重看一看vector的构造,临时依照C++11: default (1) explicit vector (c ...
- 【JS】通过JS实现超市小票打印功能——ActiveX控件
应客户的需求= = ,要在网页端实现打印小票的功能 先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好 ...