Tag:

帮助:图形竞赛问题:可能是修改后的Dijkstra或其他替代算法

我正在尝试做关于图表的比赛练习: XPTO是一个勇敢的冒险家(对他自己的好处来说有点过于苛刻),无论多么荒凉,他都吹嘘探索宇宙的每个角落。 事实上,他并没有访问人们可以轻松居住的行星,他更喜欢那些只有一个疯子才会有充分理由去的地方(例如数百万的学分)。 他的最新攻击是试图在Proxima III中生存。 问题在于Proxima III遭受高腐蚀性酸的风暴,这些酸会破坏一切,包括专门设计用于抵抗腐蚀的太空服。 我们勇敢的探险家被困在这些风暴之中的一个长方形区域。 幸运的是,他有一种仪器能够测量每个扇区上酸的精确浓度以及它对太空服的损害程度。 现在,他只需要知道他是否能逃脱风暴。 问题 问题在于找到一条允许XPTO逃离有害风暴的逃生路线。 你将获得太空服的初始能量,矩形区域的大小以及太空服在站在每个区域时所遭受的伤害。 你的任务是找到出口部门,达到它所需的步数以及他的衣服离开矩形区域时的能量。 选择的逃生路线应该是最安全的(即,他的宇航服将受损最少)。 请注意,如果他的西装的能量达到零,XPTO将会消亡。 如果有多个可能的解决方案,请选择使用最少步骤的解决方案。 如果至少有两个具有相同步数(X1,Y1)和(X2,Y2)的扇区,则选择第一个,如果X1 <X2,或者X1 = X2和Y1 <Y2。 约束0 <E≤30000套装的起始能量 0≤W≤500矩形的宽度 0≤H≤500矩形的高度 0 <X <W起始X位置 0 <Y <H起始Y位置 0≤D≤10000每个部门受到的损害 输入 给出的第一个数字是测试用例的数量。 每个案例将由一个整数为E,X和Y的行组成。以下行将包含整数W和H.以下行将保存包含太空服在相应扇区中将遭受的损害D的矩阵。 请注意,与计算机爱好者的情况一样,(1,1)对应于左上角。 产量 如果有解决方案,输出将是剩余能量,出口扇区的X和Y坐标以及将导致Rodericus安全的路线的步数。 如果没有解决方案,这句话再见残酷的世界! 将写。 样本输入 3 40 3 3 7 8 12 11 12 11 3 12 12 […]

为什么我的c代码从txt文件生成图表不起作用?

我对c语言有很多困难。 我正在尝试根据这个问题从txt文件生成图表: 为什么我在下面的代码中出现分段错误? 根据我的最佳答案进行更改后,generate_nodes方法正在运行。 但是现在我在generate_edges方法中遇到了问题。 图节点类型: #ifndef Graph_Structure #define Graph_Structure #include struct Graph_Node{ int id; char node_name[100]; bool path; struct Graph_Node* next; struct Graph_Node* edge; struct Graph_Node* next_edge; }; typedef struct Graph_Node graph_node; #endif generate_edges方法: int generate_edges(graph_node **graph, const char *file_name){ FILE *fp = fopen(file_name, “r”); if(fp == NULL) { fprintf(stderr, “Error opening file %s: […]

在无向图中查找从一个节点到另一个节点的所有路径

所以我有一个邻接列表forms的图形,结构如下面的代码所示。 鉴于这种forms的数据结构,我想知道如何找到并打印从给定节点到另一个节点的所有可能路径。 我知道我可能不得不使用堆栈来执行DFS或队列来执行BFS,我知道该怎么做,但我对如何找到所有可能的路径感到困惑 typedef struct graph { int n, maxn; Vertex** vertices; }Graph; typedef struct vertex { char* label; Edge* first_edge; }Vertex; typedef struct edge { int u, v; int weight; Edge* next_edge; }Edge ;

优化性能 – 在图形上实现自定义算法

对于我的大学任务,我需要提出一种算法,找到具有相同权重的最大边数的生成树。 可以在此处找到任务的描述: 查找具有相同权重的最大边数的生成树 。 在那里你还可以看到我用C语言实现的upvoted解决方案(由@mrip建议)。 我已在本地计算机上测试了代码,并在不同的数据集上提供了正确的输出。 但是,当我将解决方案上传到高程系统时,我发现程序完成时间比参考时间长3倍。 这是项目中的两个文件。 我当然添加了详细的评论: header.h //struct for subsets used in MST Kruskal algoritm typedef struct subset { int parent; int rank; } subset_t, *subset_p; //struct for storing graph edges typedef struct edges { int src; int dest; int weight; } edges_t, *edges_p; //struct for storing weights and number of their […]

C中的图形数据结构实现

我已经学习了图形数据结构的基础知识。 现在我想实现可以在图形上执行的所有结构/算法/操作。 请分享一些有用的链接,其中我可以开始在C中进行图形实现。

Dijkstra有一堆。 放松后如何更新堆?

我正在尝试实现Dijkstra算法。 foreach distance d d = INFINITY d[source] = 0 create_heap_based_on_Distances(); while(true) bestedge = heap[0] remove_minimum_from_heap //it will be heap[0] foreach adjacency of bestedge if (weight + bestedge_distance < current_distance) { current_distance = weight + bestedge_distance // Now I have to update heap, how can I do that? } if (heap_empty) break 所以,在放松的过程中,我如何更新堆,以便它具有正确的顺序? 我在该步骤中没有该节点的堆索引。 这是否意味着我必须创建一个新的数组,如nodes[edge] […]

什么是C的质量图库?

我正在写一些C,我需要将一个非常大的图存储为邻接矩阵。 我打算破解一个快速的图形实现,但是想先问一下人们喜欢的C(不是c ++)是否有任何好的图形库。 我将以某种标准格式导入图形(可能是GML,但这不是成败要求),将其存储为邻接矩阵,然后进行一些计算。 有什么想法吗? 谢谢! 编辑:作为一个FYI,我根本没兴趣绘制图表

如何从具有userID和pageID的大型日志文件中查找最常访问的3网页序列

给定访问的网页日志文件: Userid PageID A 1 A 2 A 3 B 2 B 3 C 1 B 4 A 4 查找最常访问的页面ID访问顺序: for A : 1-2-3, 2-3-4 for B : 2-3-4 所以,2-3-4是最常见的。 我的想法: 将文件的每个项目放入map1<key:user_id, list > 。 当list.size() == 3 ,创建一个新的struct three_hits来保存三个pageID。 将它放入map2 。 然后,在map2中找到具有最大计数器值的项目。 声明: struct three_hits { int f_page; int s_page; int t_page; }; map<string, […]

二分匹配

如何在C或C ++中实现二分匹配算法(可能基于最大流算法)? 具体来说,我把这个输入放在一个文件中:(1,3)(1,5)(2,5) (M,F) – >其中M代表MALE的id,F代表FEMALE的id。 我需要找到最大匹配数并显示匹配的夫妻。 喜欢:匹配:1&3,2和5 我已经读过一些书籍,我可以将这个问题建立在“网络中的最大流量”算法上,但除了句子“这个问题可以通过……算法解决”之外,我找不到任何具体的信息。 我对max-flow知之甚少,也不知道如何实现它…

图C实现 – 深度优先搜索

我正在尝试使用图的邻接列表表示来实现深度优先搜索算法。 这是我的代码: #include #include struct edge { int vertexIndex; struct edge *edgePtr; }edge; struct vertex { int vertexKey; int visited; struct edge *edgePtr; }vertex; void insertVertex(struct vertex *g, int vertexKey, int *vertexCount) { g[*vertexCount].vertexKey=vertexKey; g[*vertexCount].edgePtr=NULL; g[*vertexCount].visited=0; (*vertexCount)++; } void insertEdge(struct vertex *g,int vertex1, int vertex2) { struct edge *e,*e1,*e2; e=g[vertex1].edgePtr; while(e&& e->edgePtr) { e=e->edgePtr; } […]