Khi Marisa(魔理沙) và Reimu(霊夢) cùng di chuyển thì số cạnh đi được của mỗi người bằng nhau và tổng số cạnh đi được của 2 ~Zoro~ người là số chẵn.
Để 2 người sớm gặp nhau nhất có thể thì đường đi họ đi là ngắn nhất và có độ dài là số chẵn.
Do đó, ta sẽ tìm đường đi ngắn nhất từ a đến b mà số cạnh đi qua là chẵn.
Nếu tồn tại thì đáp án bài toán là một nửa độ dài đường đi ngắn nhất đó.
Còn nếu ... ♪*Ta mất nhau thật rồi, em ơi*♪, tức là không có đường đi có số cạnh chẵn nào (bao gồm việc hai vị trí của Marisa và Reimu không được nối với nhau hay có nối nhưng tất cả các đường đều lẻ), thì in ra −1;
ℭ𝔬𝔡𝔢 ℭ++:
#∈clude<iostream>#∈clude<→−−→r>#∈clude<queue>∫ma∈(){std::iosbase::syncwithstdio(false);std::c∈.tie(νllptr);std::cout.tie(νllptr);∫n,m,u,v,x,y;std::c∈⟩n⟩m⟩x⟩y;std::→−−→r<std::→−−→r<∫⟩a(n+1),dist(n+1,std::→−−→r<∫>(2,−2));/dist:Lưuđườngđingắnnhấtkèmtrạngtháichẵnlẻ/Trạngthái0làchẵn,1làlẻ/mìnhđể−2làvìlátnữađáplànửađộdàiđườngđithìviếtchogọn(Khôngnênhọctheonha)for(∫i=0;i<m;++i){std::c∈⟩u⟩v;a[u].pushback(v);a[v].pushback(u);}std::queue<std::pair<∫,∫⟩q;/Hàngđợicạnhvớitínhchẵnlẻcủanóq.push({x,0});dist[x][0]=0;whi≤(¬q.empty()){∫u=q.ont().first,k=q.ont().second;q.pop();for(∫v:a[u]){if(dist[v][1−k]==−2){dist[v][1−k]=dist[u][k]+1;/Mỗilầnthêm1cạnhthìthayđổitínhchẵnlẻq.push({v,1−k});}}}std::cout⟨dist[y]02;/Độdàiđườngđingắnnhấttừxđếnycóđộdàicạnhlàchẵn/Đáplànửađộdàiđóreturn0;}
Lưu ý: Khi lấy giá trị pair, tránh viết như thế này:
au→[u,k]=q.ont();
vì code này chỉ chạy ở C++ 17, cho vào C++ 14 là lỗi