Exemplo n.º 1
0
        public BellmanFord(WeightedGraph graph, int s)
        {
            this.G = graph;
            G.ValidateVertex(s);
            this.s = s;
            dis    = new int[G.V];
            Pre    = new int[G.V];
            for (int i = 0; i < dis.Length; i++)
            {
                dis[i] = int.MaxValue;
                Pre[i] = -1;
            }

            dis[0] = 0;
            Pre[s] = 0;
            //进行V-1次松弛操作
            for (int j = 1; j < G.V; j++)
            {
                for (int i = 0; i < G.V; i++)
                {
                    foreach (var item in G.GetAdj(i))
                    {
                        if (dis[i] != int.MaxValue)
                        {
                            int temp = dis[i] + G.GetWeight(i, item);
                            if (temp < dis[item])
                            {
                                dis[item] = temp;
                                Pre[item] = i;
                            }
                        }
                    }
                }
            }

            //再进行一次松弛操作,判断是否有负权边
            for (int i = 0; i < G.V; i++)
            {
                foreach (var item in G.GetAdj(i))
                {
                    if (dis[i] != int.MaxValue)
                    {
                        int temp = dis[i] + G.GetWeight(i, item);
                        if (temp < dis[item])
                        {
                            hasNegCycle = true;
                            break;
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public Dijkstra(WeightedGraph graph, int s)
        {
            this.G = graph;
            G.ValidateVertex(s);
            this.s = s;
            dis    = new int[G.V];
            Pre    = new int[G.V];
            for (int i = 0; i < dis.Length; i++)
            {
                dis[i] = int.MaxValue;
                Pre[i] = -1;
            }

            dis[0]  = 0;
            Pre[s]  = 0;
            visited = new bool[G.V];
            while (true)
            {
                int curDis = int.MaxValue, cur = -1;
                //1.遍历dis数组,找到未被定下的最小的节点
                for (int i = 0; i < G.V; i++)
                {
                    if (!visited[i] && dis[i] < curDis)
                    {
                        cur    = i;
                        curDis = dis[i];
                    }
                }

                if (cur == -1)
                {
                    break;
                }

                //2.确定过这个最小节点的最短路径
                visited[cur] = true;

                //3.根据这个节点的最短路的大小,更新其他节点路径的长度
                foreach (var item in G.GetAdj(cur))
                {
                    if (!visited[item])
                    {
                        int temp = dis[cur] + G.GetWeight(cur, item);
                        if (temp < dis[item])
                        {
                            dis[item] = temp;
                            Pre[item] = cur;
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
 public bool isConnected(int v)
 {
     G.ValidateVertex(v);
     return(dis[v] != int.MaxValue);
 }
Exemplo n.º 4
0
        //public IEnumerable<int> Path(int t)
        //{
        //    List<int> re = new List<int>();
        //    if (!isConnected(t))
        //    {
        //        return re;
        //    }

        //    int cur = t;
        //    while (Pre[cur] != cur)
        //    {
        //        re.Add(cur);
        //        cur = Pre[cur];
        //    }
        //    re.Add(s);
        //    re.Reverse();

        //    return re;
        //}

        public bool isConnected(int v, int w)
        {
            G.ValidateVertex(v);
            G.ValidateVertex(w);
            return(dis[v, w] != int.MaxValue);
        }
Exemplo n.º 5
0
 public bool isConnected(int v)
 {
     G.ValidateVertex(v);
     return(visited[v]);
 }