终于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 ...
随机推荐
- Creating the Help Page in ASP.NET Web API
Introduction In this article we will define the process of creating the help page in the ASP .NET We ...
- Spring的@Required注解
该@Required注解适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充.否则,容器会抛出一个BeanInitializationException异 ...
- Golang学习途径总结
最近要进入一个新团队,新团队对异步开发好像很重视,我对异步开发技术再次做了一调研,其中Golang,之前看过一次The way to go,感觉就是简化C加协程和通道,这次又重新翻起,首先看了一下&l ...
- oracle 存储过程实现数据CURD操作
1.创建数据库表: -- Create table create table TEST_TABLE ( userid NUMBER not null, username NVARCHAR2(50), ...
- 【Linux】VMware中为CentOS设置静态IP(非动态获取IP)
在VMware上安装好Linux后,默认设置的动态IP,每次启动的IP都不同,远程连接挺费劲的. 于是,需要设置静态的IP,至少我从远程工具连接上去方便多了.另外,为了安装一些软件,也需要访问互联网. ...
- jQuery图片tab栏切换
<script> $(function(){ $('.tab li').mouseenter(function(){ var $this=$(this); var index=$this. ...
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- zookeeper原生API做java客户端
简介 本文是使用apache提供的原生api做zookeeper客户端 jar包 zookeeper-3.4.5.jar Demo package bjsxt.zookeeper.base; im ...
- 【Unity笔记】UGUI物体的Rect Transform组件(Pivot中心点,Anchor锚点)
Pivot:自身中心点,图标是小蓝点.表示图片以哪个点来计算坐标值.默认在UI元素的几何中心点(0.5, 0,5). Anchor:锚点,图标是四个小三角形.表示该UI元素以父物体的哪个位置作为缩放参 ...
- C语言 · 因式分解
算法提高 8-1因式分解 时间限制:10.0s 内存限制:256.0MB 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积.例如,输入6,输出2*3.输入20,输出2*2*5 ...