t_transfer=t.current_transfer + tr;// збільшимо кількість
пересадок
tt.current_weight=t.current_weight + w;// збільшимо вартість шляху
//перерахувати показники
tt.start=vv; .finish=t.finish; ttt=new Thread (tbfs);// створили потік
ttt.Start (tt);// пустили потік з парамет
}
//якщо ж ми не дійшли ще до фінальної вершини
} _ count--;// не забути зменшити поточну кількість потоків
}
//пошук в шірінуvoid bfs (int s, int finish)
{
//окремо потрібно розглянути випадок якщо стартова вершина
збігається з фінальною (s == finish)
{// звичайно це рідкісний випадок, але тим не менш
best_path.Push (s) ;;
} _ path.Push (s);// в стеку лежить шлях, а шлях ми починаємо з
стартовою вершини
//чергу стеків вершин, а в кожному стеці лежить шлях
Queue lt; Stack lt; int gt; gt; qV=new Queue lt; Stack lt; int gt; gt; ();
qV.Enqueue (new Stack lt; int gt; (current_path));// поклали в чергу
поточний шлях
//чергу стеків р? бер, а в кожному стеці лежить шлях
Queue lt; Stack lt; int gt; gt; qE=new Queue lt; Stack lt; int gt; gt; () ;. Enqueue (new Stack lt; int gt; (current_pathE));// поклали в чергу
поточний шлях
Queue lt; int gt; qW=new Queue lt; int gt; ();// чергу ваг для кожного путі.Enqueue (0);// поклали в чергу поточний нульову вагу lt; int gt; qT=new Queue lt; int gt; ();// чергу кількості пересадок для
кожного путі.Enqueue (0);// поклали в чергу поточне нульове кількість
пересадок (qV.Count!=0)//поки ми не переглянемо всі можливі шляхи
{_ path=new Stack lt; int gt; (qV.Dequeue ());// дістаємо з стека
поточний шлях вершін_pathE=new Stack lt; int gt; (qE.Dequeue ());// Дістаємо з стека
поточний шлях ребер
current_weight=qW.Dequeue ();// дізнаємося його вага
current_transfer=qT.Dequeue ();// Дізнаємося скільки пересадок було на
цьому путіv;// номер поточної вершини=current_path.Peek ();// Дізнаємося номер поточної вершини (v == finish)
{
//якщо дійшли до фінальної вершини
if (current_weight lt; best_weight)
{_ weight=current_weight; _path=new Stack lt; int gt; (current_path); _ pathE=new Stack lt; int gt; (current_pathE);
}
//якщо дійшли до фінальної вершини
}
{
//якщо ж ми не дійшли ще до фінальної вершини
//йти з цієї вершини в усі інші по черзі
foreach (int iE in tn.aVertex [v] .iEdge)
{vv;// один з варіантів, куди можна піти
if (tn.aEdge [iE] .srcVertex == v)=tn.aEdge [iE] .destVertex;=tn.aEdge [iE] .srcVertex;
if (current_path.Contains (vv) == true)//туди йти не можна, ми там вже
були;// і далі можна цю вершину не обраховують (tn.aVertex [vv] .Enabled == false)//в неї йти не можна, вона
заблокована;// і далі можна цю вершину не обраховують
//по цьому ребру йти не можна, воно заблоковане
if (tn.aEdge [iE] .Enabled == false)
continue;// і далі можна цю вершин не обсчітиватьw=tn.aEdge [iE] .Weight;// вага того ребра по якому ми можемо
піти
if (current_weight + w gt; best_weight)//є легші шляхи
continue;// і далі можна цю вершин не обсчітиватьt;// чи потрібна пересадка для потрапляння в наступну
//вона потрібна якщо вершини належать різним транспортним мережам
if (tn.aVertex [v] .iGraph!=tn.aVertex [vv] .iGraph)
t=1;=0;
//є більш короткі шляхи
if (current_transfer + t gt; numericUpDownTransfer.Value)
continue;// і далі можна цю вершину не обраховують
//йти в цю вершіну_path.Push (vv);// покласти в стек вершіну_pathE.Push (iE);// покласти в стек ребро
//йти в цю вершину
//перерах...