- 论坛徽章:
- 0
|
本帖最后由 cenalulu 于 2012-12-04 09:52 编辑
# add by cenalulu: 解答见2、3楼
刚学MySQL在做一题目,但一直出现错误。
题目是关于最小生成树,给一个新的路径然后检查已有路径中有没有路相连。
例子:
edge_set = '1:2,3:5,2:9,1:7,5:10' // (1->2,3->5,2->9,1->7,5->10)
new_path = '1:9' // (1->2, 2->9) 所以 1:9 已经在 edge_set 里
我的思路是
1) 如果 edge_set 是空的 或 只有一個 path 而且 path != new_path, return FALSE
2) 如果 new_path 在 edge_set 里, return TRUE
3) 从 edge_set 里抽出第一个 path 和 new_path 比较,
如果 path 左节点 和 new_path 左节点是一样, sub_path = path右节点->new_path右节点 // path=1:2, new_path=1:9, sub_path=2:9
如果 path 右节点 和 new_path 右节点是一样, sub_path = path左节点->new_path左节点 // path=1:5, new_path=2:5, sub_path=1:2
edge_set = edge_set - path
回到 1) // call check_path(sub_path, edge_set, is_cyclic)- drop procedure if exists check_path;
- DELIMITER //
- CREATE procedure check_path(
- in new_path varchar(512),
- in edge_set varchar(1024),
- out is_cyclic bool
- )
- BEGIN
- DECLARE sub_path varchar(512);
- DECLARE temp_edge_set varchar(1024);
- DECLARE comma_index int;
- DECLARE colon_index int;
- DECLARE left_sub_node varchar(256);
- DECLARE right_sub_node varchar(256);
- DECLARE left_node varchar(256);
- DECLARE right_node varchar(256);
- set comma_index = locate(',', edge_set);
- IF LENGTH(edge_set) = 0 OR comma_index = 0 AND find_in_set(new_path, edge_set) = 0 THEN
- SET is_cyclic = FALSE;
- ELSEIF find_in_set(new_path, edge_set) <> 0 THEN
- SET is_cyclic = TRUE;
- ELSE
- SET sub_path = SELECT SUBSTRING_INDEX(edge_set, ',', 1);
- SET temp_edge_set = SELECT SUBSTRING(edge_set FROM comma_index + 1);
- SET left_node = SELECT SUBSTRING_INDEX(new_path, ':', 1);
- SET right_node = SELECT SUBSTRING(locate(':', new_path) FROM colon_index + 1);
- SET left_sub_node = SELECT SUBSTRING_INDEX(sub_path, ':', 1);
- SET right_sub_node = SELECT SUBSTRING(locate(':', sub_path) FROM colon_index + 1);
- IF left_node = left_sub_node THEN
- IF right_node > right_sub_node THEN
- SET sub_path = CONCAT(right_sub_node, ':', right_node);
- ELSE
- SET sub_path = CONCAT(right_node, ':', right_sub_node);
- ELSEIF right_node = right_sub_node THEN
- IF left_node > left_sub_node THEN
- SET sub_path = CONCAT(left_sub_node, ':', left_node);
- ELSE
- SET sub_path = CONCAT(left_node, ':', left_sub_node);
- CALL check_path(sub_path, temp_edge_set, is_cyclic);
- END //
- DELIMITER ;
复制代码 Error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT SUBSTRING_INDEX(edge_set, ',', 1);
SET temp_edge_set = SELECT SUBSTRI' at line 22 |
|