สมมติว่าเรามีหนึ่งกราฟดังด้านล่าง กราฟนั้นคือกราฟปีเตอร์สัน จุดยอดมีตัวเลขตั้งแต่ 0 ถึง 9 จุดยอดแต่ละจุดมีตัวอักษรบางตัว ลองพิจารณาการเดิน W ในกราฟนั้นโดยใช้จุดยอด L สตริง S ที่มีตัวอักษร L เกิดขึ้นจากการเดิน W เมื่อลำดับตัวอักษรใน W และ S เหมือนกัน เราสามารถเยี่ยมชมจุดยอดได้หลายครั้ง

ตัวอย่างเช่น สตริง S หนึ่งเส้นเหมือนกับ "ABBECD" ซึ่งเกิดขึ้นได้จากการเดิน (0, 1, 6, 9, 7, 2, 3) หน้าที่ของเราคือค้นหาการเดินดังกล่าว และหากการเดินนั้นมีอยู่ ให้ค้นหาการเดินแบบนั้นอย่างน้อยที่สุด หากไม่มีการเดินดูด ให้ส่งคืน -1
อัลกอริทึม
petersonGraphWalk(S, v) −
begin res := starting vertex for each character c in S except the first one, do if there is an edge between v and c in outer graph, then v := c else if there is an edge between v and c+5 in inner graph, then v := c + 5 else return false end if put v into res done return true end
ตัวอย่าง
#include<iostream>
using namespace std;
bool adj_mat[10][10] = {{0, 1, 0, 0, 1, 1, 0, 0, 0, 0},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 0, 1, 0},
{1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 1, 1},
{0, 0, 1, 0, 0, 1, 0, 0, 0, 1},
{0, 0, 0, 1, 0, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 1, 1, 0, 0}
};
char S[100005];
char res[100005];
bool petersonGraphWalk(char* S, int v){
res[0] = v + '0';
for(int i = 1; S[i]; i++){
//traverse the outer graph
if(adj_mat[v][S[i] - 'A'] || adj_mat[S[i] - 'A'][v]){
v = S[i] - 'A';
}
//then check the inner graph
else if(adj_mat[v][S[i] - 'A' + 5] || adj_mat[S[i] - 'A' + 5][v]){
v = S[i] - 'A' + 5;
}else{
return false;
}
res[i] = v + '0';
}
return true;
}
main() {
char* str = "ABBECCD";
if(petersonGraphWalk(str, str[0] - 'A') || petersonGraphWalk(str, str[0] - 'A' + 5)){
cout << res;
}else{
cout << -1;
}
} ผลลัพธ์
0169723