я списків ребер і вершин:
public void Clear ()
{
nodes.Clear ();
edges.Clear ();
}
. Метод Draw відповідає за графічне відображення графа на переданій в функцію графічному контексті:
public void Draw (ref Graphics g)
{
Pen pen=new Pen (Color.Black, 5);
for (int i=0; i lt; edges.Count; i ++)
{
Point xFrom, xTo;
int node1, node2;
edges [i] .GetLinkedNodes (out node1, out node2);
xFrom=new Point (nodes [node1] .GetPositionX (), nodes [node1] .GetPositionY ());
xTo=new Point (nodes [node2] .GetPositionX (), nodes [node2] .GetPositionY ());
g.DrawLine (pen, xFrom, xTo);
}
for (int i=0; i lt; nodes.Count; i ++)
{
GraphNode node=nodes [i];
if (node.isExists ())
{
bool isOkNode=false;
foreach (GraphEdge edge in edges)
{
int node1, node2;
edge.GetLinkedNodes (out node1, out node2);
if (node1 == i || node2 == i)
{
isOkNode=true;
break;
}
}
if (isOkNode)
g.DrawImage (imgOkNode, node.GetPositionX () - imageCenter, node.GetPositionY () - imageCenter);
else
g.DrawImage (imgNode, node.GetPositionX () - imageCenter, node.GetPositionY () - imageCenter);
g.DrawString ((i + 1) .ToString (), font, Brushes.Black, node.GetPositionX () - 12, node.GetPositionY () - 12);
}
}
}
4. Метод EdgeAdd пов'язує вершини, що мають зазначені індекси (передані в метод в якості параметрів), якщо вершини до цього ще не були пов'язані:
public int EdgeAdd (int node1, int node2)
{
bool canLink=true;
foreach (GraphEdge edge in edges)
{
int n1, n2;
edge.GetLinkedNodes (out n1, out n2);
if ((n1 == node1 || n1 == node2) amp; amp; (n2 == node1 || n2 == node2))
{
canLink=false;
break;
}
}
if (canLink)
{
edges.Add (new GraphEdge (node1, node2));
return edges.Count - 1;
}
return - 1;
}
. Метод EdgeRemove видаляє ребро з заданим індексом:
public bool EdgeRemove (int id)
{
if (edges.Count gt; id amp; amp; edges.Count gt; - 1)
{
edges.RemoveAt (id);
}
return false;
}
. Метод Load служить для завантаження графа з файлу з заданим ім'ям, що передається як параметр:
public bool Load (string filename)
{
FileStream fs=new FileStream (filename, FileMode.Open, FileAccess.Read);
BinaryReader r=new BinaryReader (fs);
string sign=r.ReadString ();
if (sign.Equals (signature, StringComparison.InvariantCulture))
{
Clear ();
int nodeCount=r.ReadInt32 ();
int edgeCount=r.ReadInt32 ();
for (int i=0; i lt; nodeCount; i ++)
{
bool isValide=r.ReadBoolean ();
NodeAdd (r.ReadInt32 (), r.ReadInt32 (), isValide);
}
for (int i=0; i lt; edgeCount; i ++)
{
EdgeAdd (r.ReadInt32 (), r.ReadInt32 ());
}
r.Close ();
return true;