- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在尝试做 341 Non-Stop Travel Problem在 UVa Judge Online 上,但是当我提交我的代码时,法官说存在运行时错误 (RE) 而我无法检测到它。我使用 Dijkstra 算法和邻接列表图解决了这个问题。当我测试输入示例时,我的程序运行良好,但我不知道如何跳过这个运行时错误!我的代码如下
#include <iostream>
#include <vector>
#include <list>
#define INFINITY 9999999
#define NIL -1
using namespace std;
class Dijkstra;
class Arc;
class Vertex;
class Graph;
class Arc
{
public:
int src;
int dst;
int weight;
Arc (int _src, int _dst, int _weight)
{
src = _src;
dst = _dst;
weight = _weight;
}
~Arc ()
{
}
};
class Vertex
{
public:
vector<Arc*> arcs;
Vertex ()
{
arcs = vector<Arc*>();
}
~Vertex ()
{
for (int i = 0; i < (int) arcs.size(); i++)
{
delete arcs[i];
}
}
};
class Graph
{
public:
vector<Vertex*> vertices;
Graph()
{
vertices = vector<Vertex*>();
}
void addVertex ()
{
Vertex* v = new Vertex();
vertices.push_back(v);
}
void addArc(int _src, int _dst, int _weight)
{
Arc* a = new Arc(_src,_dst, _weight);
vertices[_src]->arcs.push_back(a);
}
int w(int u, int v)
{
for (int i = 0; i < (int) vertices[u]->arcs.size(); i++)
{
if (vertices[u]->arcs[i]->dst == v)
{
return vertices[u]->arcs[i]->weight;
}
}
return INFINITY;
}
void printGraph()
{
for (int i = 0; i < (int) vertices.size(); i++)
{
for (int j = 0; j < (int) vertices[i]->arcs.size(); j++)
{
cout << i+1 << " " << vertices[i]->arcs[j]->dst+1 << " " << vertices[i]->arcs[j]->weight << "\t";
}
cout << endl;
}
}
~Graph ()
{
for (int i = 0; i < (int) vertices.size(); i++)
{
vertices[i]->~Vertex();
delete vertices[i];
}
}
};
class Dijkstra
{
public:
int* d;
int* pi;
list<int> Q;
Dijkstra()
{
}
void shortest_paths(Graph* G, int s)
{
initialize(G,s);
Q = addVertices(G);
while (Q.size() != 0)
{
int u = extractCheapest(Q);
Q.remove(u);
if (d[u] == INFINITY)
{
break;
}
for (int i = 0; i < (int) G->vertices[u]->arcs.size(); i++)
{
int v = G->vertices[u]->arcs[i]->dst;
relax(G,u,v);
}
}
}
void initialize(Graph* G, int s)
{
int size = G->vertices.size();
d = new int[size];
pi = new int[size];
for (int i = 0; i < size; i++)
{
d[i] = INFINITY;
pi[i] = NIL;
}
d[s] = 0;
}
void relax(Graph* G, int u, int v)
{
int w = (d[u] + G->w(u,v));
if (d[v] > w)
{
d[v] = w;
pi[v] = u;
}
}
list<int> addVertices(Graph* G)
{
list<int> q;
for (int i = 0; i < (int) G->vertices.size(); i++)
{
q.push_back(i);
}
return q;
}
int extractCheapest(list<int> Q)
{
int minorDist = INFINITY;
int minorVertex = NIL;
list<int>::iterator it;
for (it = Q.begin(); it != Q.end(); it++)
{
int dist = d[(*it)];
if ( dist < minorDist )
{
minorDist = dist;
minorVertex = (*it);
}
}
return minorVertex;
}
void printOutput (int cnt, int _d)
{
cout << "Case " << cnt << ": Path = ";
printRecursive(_d);
cout << "; ";
cout << d[_d] <<" second delay" << endl;
}
void printRecursive(int _d)
{
if(pi[_d] == NIL)
{
cout << " " << _d + 1;
}
else
{
printRecursive(pi[_d]);
cout << " "<< _d + 1;
}
}
~Dijkstra()
{
delete[] d;
delete[] pi;
}
};
int main ()
{
int NI;
int NE;
int weight;
int v;
int s;
int d;
int cnt = 0;
while (cin >> NI)
{
cnt++;
if (NI !=0 )
{
Graph* G = new Graph();
for (int u = 0; u < NI; u++)
{
G->addVertex();
cin >> NE;
for (int j = 0; j < NE; j++)
{
cin >> v;
cin >> weight;
G->addArc(u,v-1,weight);
}
}
cin >> s;
cin >> d;
Dijkstra* dijkstra = new Dijkstra();
dijkstra->shortest_paths(G,s-1);
dijkstra->printOutput(cnt,d-1);
G->~Graph();
dijkstra->~Dijkstra();
}
}
return 0;
}
----------------------------编辑---------------- --------------
我在代码中做了一些事情以避免运行时错误。首先,我纠正了我的内存泄漏错误(感谢 us2012 和 NPE!),然后我处理了断开连接的图的情况。 This is the version of the code that was accepted by the judge.
最佳答案
问题出在这里:
vertices[i]->~Vertex();
delete vertices[i];
析构函数在您删除
时自动调用,因此实际上您调用了它两次。当您不知道它时,这就是您发现它的方式:(相关行标记为 "HERE:"
)
$ valgrind --tool=memcheck ./program341
==3954== Memcheck, a memory error detector
==3954== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==3954== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==3954== Command: ./program341
==3954==
5
2 3 3 4 6
3 1 2 3 7 5 6
1 4 5
0
1 4 7
2 4
Case 1: Path = 2 1 4; 8 second delay
==3954== Invalid read of size 4
==3954== at 0x8048F00: Vertex::~Vertex() (341.cc:48)
HERE: ==3954== by 0x8049155: Graph::~Graph() (341.cc:103)
==3954== by 0x8048D7C: main (341.cc:254)
==3954== Address 0x4336198 is 0 bytes inside a block of size 8 free'd
==3954== at 0x402AC1D: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3954== by 0x804B1BA: __gnu_cxx::new_allocator<Arc*>::deallocate(Arc**, unsigned int) (new_allocator.h:100)
==3954== by 0x804A3DA: std::_Vector_base<Arc*, std::allocator<Arc*> >::_M_deallocate(Arc**, unsigned int) (stl_vector.h:175)
==3954== by 0x804A276: std::_Vector_base<Arc*, std::allocator<Arc*> >::~_Vector_base() (stl_vector.h:161)
==3954== by 0x8049779: std::vector<Arc*, std::allocator<Arc*> >::~vector() (stl_vector.h:404)
==3954== by 0x8048F3B: Vertex::~Vertex() (341.cc:45)
HERE: ==3954== by 0x8049135: Graph::~Graph() (341.cc:102)
==3954== by 0x8048D7C: main (341.cc:254)
...
...
关于c++ - UVa Online Judge Runtime Error C++ (341 - Non-Stop Travel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14445816/
任务是编写代码,将敏感度标签应用于 SharePoint Online 文档库中的文档,而无需下载文件。 到目前为止,我已经探索了以下 API: SharePoint REST API v1 :可用于
期望的行为 将托管在 SharePoint Online 上的 Excel 文档嵌入到 HTML 页面中。 实际行为 嵌入加载,但是没有水平滚动条。 获取视口(viewport)右侧数据的唯一方法是单
我想在数据中心选择一个事件分区。通常我会使用以下语句: INVANTIVE> use 1552839 2> Exclamation itgendhb077: Error in Invantive Da
我正在使用 Azure Functions,特别是 PowerShell 脚本函数。我想知道如何使用连接到 SharePoint Online 的脚本。 要针对 SharePoint Online 运
我正在尝试使用 API 按姓名查询客户。具有非 ASCII 字符的名称(例如 민준 或 Włodarski)会导致查询失败。这是一个示例查询: SELECT * FROM Customer WHERE
我已经将一个SharePoint列表从2019年迁移到365年。该列表具有NINTEX形式,而该NINTEX形式具有较少的JavaScript文件。在SP Online中,NWF$().SPServi
我正在尝试在内存中生成 PDF 以将其发送到 WS。此 PDF 应在内存 (Stream) 和 Microsoft CRM“云”中的插件代码中创建。这可能吗? 在插件中(已经编码和部署)我有这行,第
当我使用 Invantive Data Hub 从多个 Exact Online 公司下载数据时,我得到了重复的行,而我希望每个公司只有一行。 我使用以下查询: select gla.code ,
我们刚刚上线 https://ecotaksen.be 。 Exact 上的查询和更新运行良好,但安装生产许可证后出现错误 itgenobr001:找不到客户端。。 我的数据容器规范是: 使用具有相
我在 Dynamics CRM Online 2015 中创建了一个插件,用于在 SharePoint Online 文档库中创建文件夹。该插件工作正常。但是,我想在 CRM 中的帐户名称更改时重命名
我正在关注 this blog在 SPFX 部分实现 fluentUI,但在执行“Gulp Build”时出现以下错误: Error - [tsc] node_modules/@fluentui/re
我能够在桌面 .Net 项目中通过 MSAL 检索和使用访问 token 。我可以成功检索 token ,并且它们在我的 Graph 调用中有效。 但是,尝试将访问 token 与 SharePoin
为了遵守法规,我尝试从我的一些部门下载采购发票文件(PDF 文件),将它们保存在磁盘上以供存档。 我使用 Invantive 查询工具来执行此操作。我想知道使用哪个表以及如何仅针对采购发票文档导出这些
我正在开发一个基于 Spring-MVC 的 Web 应用程序,该应用程序使用 Cometd 进行聊天。为了实时管理哪些用户在线,我们在用户在线时发送通知。因此,当窗口关闭时,不会出现通知,并且 30
我在 Visual Studio Online 上使用 GIT 进行源代码管理。我想将一个项目从我的个人 VSO 账户转移到我的企业 VSO 账户。例如。从 account1.visualstudio
当我关闭 Word Online 中的对话框时,我在控制台中收到以下消息: Unknown conversation Id. 我不是得到一个可以处理的代码,而是得到...... (macOS/Chro
短版:如何加载 PowerApps 中托管元数据字段的所有可用选项? 长版: 我有一个正常工作的 PowerApps 应用程序,但用户希望能够在离线时添加数据,并在再次在线时同步回来。官方 Power
我是 QuickBooks 的新手,我所有的搜索都导致了相互矛盾的答案。我真的需要知道这一点才能继续前进。 我们有一个本地应用程序(如果重要的话,旧版 MFC 应用程序)。我们的一些客户使用 Quic
这是我的代码,我尝试使用 countOnline 函数计算我们有多少在线用户。 我遇到错误“无法读取未定义的‘在线’属性”; function countOnline(usersObj) { le
如果我们有一个巨大的事实表并想要添加一个新维度,我们可以这样做: BEGIN TRANSACTION ALTER TABLE [GiantFactTable] ADD NewDimValueId IN
我是一名优秀的程序员,十分优秀!