Sorts a graph by the dependencies. : Geometry « Development Class « C# / C Sharp

Home
C# / C Sharp
1.2D Graphics
2.Class Interface
3.Collections Data Structure
4.Components
5.Data Types
6.Database ADO.net
7.Date Time
8.Design Patterns
9.Development Class
10.Event
11.File Stream
12.Generics
13.GUI Windows Form
14.Internationalization I18N
15.Language Basics
16.LINQ
17.Network
18.Office
19.Reflection
20.Regular Expressions
21.Security
22.Services Event
23.Thread
24.Web Services
25.Windows
26.Windows Presentation Foundation
27.XML
28.XML LINQ
C# Book
C# / C Sharp by API
C# / CSharp Tutorial
C# / CSharp Open Source
C# / C Sharp » Development Class » GeometryScreenshots 
Sorts a graph by the dependencies.
         
using System;

namespace DatabaseSchemaReader.Utilities
{
    /// <summary>
    /// Sorts a graph by the dependencies.
    /// </summary>
    /// <remarks>
    /// Copied directly from http://tawani.blogspot.com/2009/02/topological-sorting-and-cyclic.html
    /// (in turn from a Java example).
    /// </remarks>
    class TopologicalSorter
    {

        private readonly int[] _vertices; // list of vertices  
        private readonly int[,_matrix; // adjacency matrix  
        private int _numVerts; // current number of vertices  
        private readonly int[] _sortedArray;

        public TopologicalSorter(int size)
        {
            _vertices = new int[size];
            _matrix = new int[size, size];
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++)
                    _matrix[i, j0;
            _sortedArray = new int[size]// sorted vert labels  
        }

        public int AddVertex(int vertex)
        {
            _vertices[_numVerts++= vertex;
            return _numVerts - 1;
        }

        public void AddEdge(int start, int end)
        {
            _matrix[start, end1;
        }

        public int[] Sort() // toplogical sort  
        {
            while (_numVerts > 0// while vertices remain,  
            {
                // get a vertex with no successors, or -1  
                int currentVertex = NoSuccessors();
                if (currentVertex == -1// must be a cycle                  
                    throw new InvalidOperationException("Graph has cycles");

                // insert vertex label in sorted array (start at end)  
                _sortedArray[_numVerts - 1= _vertices[currentVertex];

                DeleteVertex(currentVertex)// delete vertex  
            }

            // vertices all gone; return sortedArray  
            return _sortedArray;
        }

        // returns vert with no successors (or -1 if no such verts)  
        private int NoSuccessors()
        {
            for (int row = 0; row < _numVerts; row++)
            {
                bool isEdge = false// edge from row to column in adjMat  
                for (int col = 0; col < _numVerts; col++)
                {
                    if (_matrix[row, col0// if edge to another,  
                    {
                        isEdge = true;
                        break// this vertex has a successor try another  
                    }
                }
                if (!isEdge// if no edges, has no successors  
                    return row;
            }
            return -1// no  
        }

        private void DeleteVertex(int delVert)
        {
            // if not last vertex, delete from vertexList  
            if (delVert != _numVerts - 1)
            {
                for (int j = delVert; j < _numVerts - 1; j++)
                    _vertices[j= _vertices[j + 1];

                for (int row = delVert; row < _numVerts - 1; row++)
                    MoveRowUp(row, _numVerts);

                for (int col = delVert; col < _numVerts - 1; col++)
                    MoveColLeft(col, _numVerts - 1);
            }
            _numVerts--; // one less vertex  
        }

        private void MoveRowUp(int row, int length)
        {
            for (int col = 0; col < length; col++)
                _matrix[row, col= _matrix[row + 1, col];
        }

        private void MoveColLeft(int col, int length)
        {
            for (int row = 0; row < length; row++)
                _matrix[row, col= _matrix[row, col + 1];
        }

    }
}

   
    
    
    
    
    
    
    
    
  
Related examples in the same category
1.Convert Meters To Inches
2.Convert Meters To Miles
3.Get Steps FromD istance And Stride
4.Convert Miles To Meters
5.Distance Util
6.PointD
7.Calculate Gradient Angle
8.Convert Meters To Feet
9.Get distance between two points
10.Tests if two line segments intersect or not.
11.Degrees To Radians
12.Radians To Degrees
13.Angles Difference
14.Degrees To Radians and Radians To Degrees
15.Get Distance From Steps
16.Meter to feet and feet to Mile
17.Distance From Point To Line
java2s.com  |  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.