复制
收藏
提问
简洁
5717:带权图 通过率 45% 时间限制 1000ms 内存限制 256MB 描述 输入一个带权值的无向图,有Q次查询,每次查询给定两个顶点u和v,如果u和v之间有边,那么输出边(u, v)的权值,如果不存在边输出-1,如果u==v,那么输出0。 输入 第1行:两个空格分隔的整数N和M,表示无向图拥有N个顶点(编号为1…N),M条边。 接下来M行:每行3个空格分隔的整数u, v, w 。表示u,v之间存在一条权值为w的无向边。 接下来1行:一个正整数Q,表示查询次数。 接下来Q行:每行两个用空格隔开的整数u和v ,表示查询u和v之间边的权值。 数据范围:2≤N≤10000,1≤M≤5000,1≤w≤10000, 1≤Q≤10002≤N≤10000,1≤M≤5000,1≤w≤10000,1≤Q≤1000 。 输出 Q行:每行一个整数,代表该次查询的顶点u和v之间的边的权值。 输入样例 1 4 4 1 2 15 1 4 8 2 3 6 3 4 9 3 1 2 2 2 1 3 输出样例1 15 0 -1
2个月前
全网
文档
学术
百科
知识库
回答简洁模式
深入研究一些
这个问题是一个典型的图论问题,涉及到图的存储和查询。我们可以使用邻接矩阵或邻接表来存储图。由于题目中的数据范围较大,使用邻接矩阵可能会占用大量的内存,因此推荐使用邻接表。
以下是解决这个问题的步骤:
-
读取输入:首先读取顶点数N和边数M,然后读取M条边的信息,包括两个顶点u和v以及它们之间的权值w。接着读取查询次数Q,然后读取Q次查询的顶点对。
-
构建邻接表:使用一个数组来存储邻接表,数组的索引对应顶点编号,每个索引下存储一个链表或列表,包含与该顶点直接相连的顶点和对应的权值。
-
处理查询:对于每次查询,检查u和v是否在同一个链表中。如果在,输出对应的权值;如果不在,输出-1。如果u和v相同,输出0。
-
输出结果:对于每次查询,输出相应的结果。
以下是这个问题的伪代码实现:
function main():
(N, M) = read_input()
adj_list = initialize_adj_list(N)
for i in range(M):
(u, v, w) = read_input()
add_edge(adj_list, u, v, w)
Q = read_input()
for i in range(Q):
(u, v) = read_input()
print(query(adj_list, u, v))
function initialize_adj_list(N):
return [new List() for _ in range(N+1)]
function add_edge(adj_list, u, v, w):
adj_list[u].append((v, w))
adj_list[v].append((u, w)) # 因为是无向图
function query(adj_list, u, v):
if u == v:
return 0
for edge in adj_list[u]:
if edge[0] == v:
return edge[1]
return -1
请注意,这个伪代码只是一个示例,实际的实现可能需要考虑更多的细节,比如输入输出的具体格式、数据类型的选择等。此外,由于查询次数Q可能非常大,优化查询的效率也是必要的。在实际编程中,你可能需要使用具体的编程语言来实现这个算法。
你觉得结果怎么样?