aph ()
{= new List lt; Node gt; ();=new List lt; Node gt; (); (); all=new List lt; string gt; (); (int i=0; i lt; dataGridView1.RowCount; i ++)
{.Add((string)dataGridView1.Rows[i].Cells[1].Value);.AddRange(((string)dataGridView1.Rows[i].Cells[2].Value).Split(laquo;,raquo;));
} n=all.Distinct (). Count (x= gt; x!= 0 ) + dataGridView1.RowCount - 1; (int i=0; i lt; n; i ++ )
{();
} (int i=0; i lt; dataGridView1.RowCount; i ++)
{prev=int.Parse ((string) dataGridView1.Rows [i] .Cells [1] .Value); next=int.Parse ((string) dataGridView1.Rows [i] .Cells [2] .Value); edge=AddEdge (prev, next); (prev == 0)
{
var node=edge.Prev;
L.Add (node);
}
} (L.Any ())=L.First ();
} CheckLoop (Node node)
{
//3. Для заданого вузла дивимося, чи виходить з нього хоча б одне немаркованих ребро.
var unmarked=node.Edges.Where (x= gt; x.Mark == false);
if (unmarked.Any ())
{
//Якщо так, вибираємо нове немаркованих виходить ребро і маркіруємо його.
//І переходимо по ньому до новому вузлу і повертаємося до кроку 3.
var edge=unmarked.First () ;. Mark=true; (L.Contains (edge.Next)) return true;
{
L.Add (edge.Next);
return CheckLoop (edge.Next);
}
}
//Eсли немає - зайшли в безвихідь.
//Повертаємося до кроку 3.
{
//Видаляємо останній вузол зі списку і повертаємося до попереднього вузлу.
var last=L.Last () ;. Remove (last);
last=L.Last ();
//Якщо це початковий вузол, значить циклів немає, і алгоритм завершується.
if (last == first)
return false; CheckLoop (last);
} false;
} Node first; List lt; Node gt; L=new List lt; Node gt; (); int count; AddNode ()
{++; node=new Node () ;. Id=count; .Add (node);
} AddEdge (int prev, int next)
{edge=new Edge () ;. Mark=false; .Prev=Nodes [prev] ;. Next=Nodes [next]; [prev] .Edges.Add (edge); edge;
} void btnDeadlock_Click (object sender, EventArgs e)
{
{();
} (Exception)
{. AppendText ( Некоректно введені дані n ) ;;
} (L.Any () == false)
{. AppendText ( Некоректно введені дані n ) ;;;
} last=L.Last (); (CheckLoop (last))
{. AppendText ( Є блокування n );
}
{. AppendText ( Блокування не виявлені n );
}
} void button1_Click (object sender, EventArgs e)
{. Rows.Clear (); (int i=0; i lt; numericUpDown1.Value; i ++)
{. Rows.Add () ;. Rows [i] .Cells [0] .Value=i + 1;
}
}
}
}
Додаток 2.
System.Collections.Generic;System.Windows;GalaSoft.MvvmLight;GalaSoft.MvvmLight.Command;DeadlockPreventing.ViewModel
{
/// lt; summary gt;
/// This class contains properties that the main View can data bind to.
/// lt; para gt;
/// Use the lt; strong gt; mvvminpc lt;/strong gt; snippet to add bindable properties to this ViewModel.
/// lt;/para gt;
/// lt; para gt;
/// You can also use Blend to data bind with the tool's support.
/// lt;/para gt;
/// lt; para gt;
/// See # justify gt; /// lt;/para gt;
/// lt;/summary gt; class MainViewModel: ViewModelBase
{
/// lt; summary gt;
/// Initializes a new instance of the MainViewModel class.
/// lt;/summary gt; MainViewModel ()
{= 3; еResources=3;
} int _processCount; int Proc...