Пример #1
0
        private void FindPath(EdgeWeightedDigraph digraph, int start)
        {
            priorityQueue.Insert(start, 0f);

            while (!priorityQueue.IsEmpty)
            {
                Relax(digraph, priorityQueue.DeleteMax());
            }
        }
Пример #2
0
 public DijkstraSP(EdgeWeightedDigraph G, int s)
 {
     edgeTo = new DirectedEdge[G.V];
     distTo = new double[G.V];
     pq = new IndexPriorityQueue<double>(G.V);
     for (int v = 0; v < G.V; v++)
         distTo[v] = Double.PositiveInfinity;
     distTo[s] = 0.0;
     pq.Insert(s, 0.0);
     while (!pq.isEmpty())
         relax(G, pq.Del());
 }
Пример #3
0
                public static void Merge(StreamReader[] streams)
                {
                    int N = streams.Length;
                    IndexPriorityQueue <string> pq = new IndexPriorityQueue <string>(N);//最大堆,从大到小排序

                    for (int i = 0; i < N; ++i)
                    {
                        if (!streams[i].EndOfStream)
                        {
                            pq.Insert(i, streams[i].ReadLine());//i是保存的元素的流在数组的索引
                        }
                    }
                    while (!pq.IsEmpty())
                    {
                        Console.WriteLine(pq.Min());
                        int i = pq.DeleteMin();
                        if (!streams[i].EndOfStream)
                        {
                            pq.Insert(i, streams[i].ReadLine());//替换为新的值
                        }
                    }
                }
Пример #4
0
        private IndexPriorityQueue<Double> pq; // eligible crossing edges

        #endregion Fields

        #region Constructors

        public PrimMST(EdgeWeightedGraph G)
        {
            edgeTo = new Edge[G.V];
            distTo = new double[G.V];
            marked = new bool[G.V];
            for (int v = 0; v < G.V; v++)
                distTo[v] = Double.PositiveInfinity;
            pq = new IndexPriorityQueue<double>(G.V);
            distTo[0] = 0.0;
            pq.Insert(0, 0.0); // Initialize pq with 0, weight 0.
            while (!pq.isEmpty())
                visit(G, pq.Del()); // Add closest vertex to tree.
        }
Пример #5
0
        List <Polygon2d> decompose_cluster_up(DMesh3 mesh)
        {
            optimize_mesh(mesh);
            mesh.CompactInPlace();
            mesh.DiscardTriangleGroups(); mesh.EnableTriangleGroups(0);

            double minLength = Settings.MaxBridgeWidthMM * 0.75;
            double minArea   = minLength * minLength;

            Dictionary <int, double>         areas   = new Dictionary <int, double>();
            Dictionary <int, HashSet <int> > trisets = new Dictionary <int, HashSet <int> >();
            HashSet <int> active_groups = new HashSet <int>();

            Action <int, int> add_tri_to_group = (tid, gid) => {
                mesh.SetTriangleGroup(tid, gid);
                areas[gid] = areas[gid] + mesh.GetTriArea(tid);
                trisets[gid].Add(tid);
            };
            Action <int, int> add_group_to_group = (gid, togid) => {
                var set = trisets[togid];
                foreach (int tid in trisets[gid])
                {
                    mesh.SetTriangleGroup(tid, togid);
                    set.Add(tid);
                }
                areas[togid] += areas[gid];
                active_groups.Remove(gid);
            };
            Func <IEnumerable <int>, int> find_min_area_group = (tri_itr) => {
                int min_gid = -1; double min_area = double.MaxValue;
                foreach (int tid in tri_itr)
                {
                    int    gid = mesh.GetTriangleGroup(tid);
                    double a   = areas[gid];
                    if (a < min_area)
                    {
                        min_area = a;
                        min_gid  = gid;
                    }
                }
                return(min_gid);
            };


            foreach (int eid in MeshIterators.InteriorEdges(mesh))
            {
                Index2i et = mesh.GetEdgeT(eid);
                if (mesh.GetTriangleGroup(et.a) != 0 || mesh.GetTriangleGroup(et.b) != 0)
                {
                    continue;
                }
                int gid = mesh.AllocateTriangleGroup();
                areas[gid]   = 0;
                trisets[gid] = new HashSet <int>();
                active_groups.Add(gid);
                add_tri_to_group(et.a, gid);
                add_tri_to_group(et.b, gid);
            }
            foreach (int tid in mesh.TriangleIndices())
            {
                if (mesh.GetTriangleGroup(tid) != 0)
                {
                    continue;
                }
                int gid = find_min_area_group(mesh.TriTrianglesItr(tid));
                add_tri_to_group(tid, gid);
            }


            IndexPriorityQueue pq = new IndexPriorityQueue(mesh.MaxGroupID);

            foreach (var pair in areas)
            {
                pq.Insert(pair.Key, (float)pair.Value);
            }
            while (pq.Count > 0)
            {
                int gid = pq.First;
                pq.Remove(gid);
                if (areas[gid] > minArea)                    // ??
                {
                    break;
                }

                List <int> nbr_groups = find_neighbour_groups(mesh, gid, trisets[gid]);
                int        min_gid = -1; double min_area = double.MaxValue;
                foreach (int ngid in nbr_groups)
                {
                    double a = areas[ngid];
                    if (a < min_area)
                    {
                        min_area = a;
                        min_gid  = ngid;
                    }
                }
                if (min_gid != -1)
                {
                    add_group_to_group(gid, min_gid);
                    pq.Remove(min_gid);
                    pq.Insert(min_gid, (float)areas[min_gid]);
                }
            }



            List <Polygon2d> result = new List <Polygon2d>();

            int[][] sets = FaceGroupUtil.FindTriangleSetsByGroup(mesh);
            foreach (var set in sets)
            {
                result.Add(make_poly(mesh, set));
            }
            return(result);
        }