亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? awd.h

?? 求最短路徑的C++ 源代碼
?? H
字號:
// file awd.h
// adjacency matrix representation of a directed weighted graph
// full version
#ifndef AdjacencyWDigraph_
#define AdjacencyWDigraph_

#include <cstdlib>
#include <iostream>
#include "fchain.h"
#include "network.h"
#include "citer.h"
#include "wnetwork.h"
#include "swap.h"
#include "make2db.h"
#include "del2d.h"

template <class T> class AdjacencyWGraph;

template<class T>
class AdjacencyWDigraph : virtual public Network,
                          virtual public WNetwork<T> {
   friend AdjacencyWGraph<T>;
   friend class AdjacencyGraph;
   public:
      AdjacencyWDigraph
               (int Vertices = 10, T noEdge = 0);
      ~AdjacencyWDigraph() {Delete2DArray(a,n+1);}
      bool Exist(int i, int j) const;
      int Edges() const {return e;}
      int Vertices() const {return n;}
      AdjacencyWDigraph<T>& Add
                        (int i, int j, const T& w);
      AdjacencyWDigraph<T>& Delete(int i, int j);
      int OutDegree(int i) const;
      int InDegree(int i) const;
      void ShortestPaths(int s, T d[], int p[]);
      void AllPairs(T **c, int **kay);
      void Output() const;
      void InitializePos() {pos = new int [n+1];}
      void DeactivatePos() {delete [] pos;}
      int Begin(int i);
      int NextVertex(int i);
      void First(int i, int& j, T& c);
      void Next(int i, int& j, T& c);
      T TSP(int v[]);
      T BBTSP(int v[]);
   private:
      void tSP(int i);
      T NoEdge;  // used for absent edge
      int n;     // number of vertices
      int e;     // number of edges
      T **a;     // adjacency matrix
      int *pos;
      // static members used by backtracking and
      // branch-and-bound methods
      static int *x,     // path to current node
                 *bestx; // best solution so far
      static T cc,       // cost at current node
               bestc;    // cost of best solution found so far
};

// define static members for T = int and float
// add definitions for additional types as needed
int  *AdjacencyWDigraph<int>::x,
     *AdjacencyWDigraph<int>::bestx,
      AdjacencyWDigraph<int>::bestc,
      AdjacencyWDigraph<int>::cc;

int  *AdjacencyWDigraph<float>::x,
     *AdjacencyWDigraph<float>::bestx;
float AdjacencyWDigraph<float>::bestc,
      AdjacencyWDigraph<float>::cc;

template<class T>
AdjacencyWDigraph<T>
   ::AdjacencyWDigraph(int Vertices, T noEdge)
{// Constructor.
   n = Vertices;
   e = 0;
   NoEdge = noEdge;
   Make2DArray(a, n+1, n+1);
   // initalize to graph with no edges
   for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
         a[i][j] = NoEdge;
}

template<class T>
bool AdjacencyWDigraph<T>::Exist(int i, int j) const
{// Does edge (i, j) exist?
   if (i < 1 || j < 1 || i > n || j > n
       || a[i][j] == NoEdge) return false;
   return true;
}

template<class T>
AdjacencyWDigraph<T>& AdjacencyWDigraph<T>
                  ::Add(int i, int j, const T& w)
{// Add edge (i,j) to digraph if not present.
   if (i < 1 || j < 1 || i > n ||
       j > n || i == j || a[i][j] != NoEdge)
       throw logic_error("is wrong");
   a[i][j] = w;
   e++;
   return *this;
}

template<class T>
AdjacencyWDigraph<T>& AdjacencyWDigraph<T>
                  ::Delete(int i, int j)
{// Delete edge (i,j).
   if (i < 1 || j < 1 || i > n ||
       j > n || a[i][j] == NoEdge)
       throw logic_error("is wrong");
   a[i][j] = NoEdge;
   e--;
   return *this;
}

template<class T>
int AdjacencyWDigraph<T>::OutDegree(int i) const
{// Return out degree of vertex i.
   if (i < 1 || i > n) throw logic_error("is wrong");
   // count out edges from vertex i
   int sum = 0;
   for (int j = 1; j <= n; j++)
      if (a[i][j] != NoEdge) sum++;
   return sum;
}

template<class T>
int AdjacencyWDigraph<T>::InDegree(int i) const
{// Return indegree of vertex i.
   if (i < 1 || i > n) throw logic_error("is wrong");
   // count in edges at vertex i
   int sum = 0;
   for (int j = 1; j <= n; j++)
      if (a[j][i] != NoEdge) sum++;
   return sum;
}

template <class T>
void AdjacencyWDigraph<T>::Output() const
{
   for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++)
         cout << a[i][j] << " ";
      cout << endl;}
}

template<class T>
int AdjacencyWDigraph<T>::Begin(int i)
{// Return first vertex adjacent to vertex i.
if (i < 1 || i > n) throw logic_error("is wrong");

   // look for first adjacent vertex
   for (int j = 1; j <= n; j++)
      if (a[i][j] != NoEdge) {// j is first one
         pos[i] = j;
         return j;}

   pos[i] = n + 1; // no adjacent vertex
   return 0;
}

template<class T>
void AdjacencyWDigraph<T>::First(int i, int& j, T& c)
{// Return first vertex j and weight of (i,j).
   if (i < 1 || i > n) throw logic_error("is wrong");

   // look for first adjacent vertex
   for (j = 1; j <= n; j++)
      if (a[i][j] != NoEdge) {// j is first one
         pos[i] = j;
         c = a[i][j];
         return;}

   pos[i] = n + 1; // no adjacent vertex
   j = 0;
}

template<class T>
int AdjacencyWDigraph<T>::NextVertex(int i)
{// Return next vertex adjacent to vertex i.
   if (i < 1 || i > n) throw logic_error("is wrong");

   // find next adjacent vertex
   for (int j = pos[i] + 1; j <= n; j++)
      if (a[i][j] != NoEdge) {// j is next vertex
         pos[i] = j; return j;}

   pos[i] = n + 1; // no next vertex
   return 0;
}

template<class T>
void AdjacencyWDigraph<T>::Next(int i, int& j, T& c)
{// Return next vertex j and weight of (i,j).
   if (i < 1 || i > n) throw logic_error("is wrong");

   // find next adjacent vertex
   for (j = pos[i] + 1; j <= n; j++)
      if (a[i][j] != NoEdge) {// j is next vertex
         pos[i] = j;
         c = a[i][j];
         return;}

   pos[i] = n + 1; // no next vertex
   j = 0;
}

template<class T>
void AdjacencyWDigraph<T>::ShortestPaths(int s,
                          T d[], int p[])
{// Shortest paths from vertex s, return shortest
 // distances in d and predecessor info in p.
   if (s < 1 || s > n) throw logic_error("is wrong");
   Chain<int> L; // list of reachable vertices for
                 // which paths have yet to be found
   ChainIterator<int> I;
   // initialize d, p, and L
   for (int i = 1; i <= n; i++){
      d[i] = a[s][i];
      if (d[i] == NoEdge) p[i] = 0;
      else {p[i] = s; 
            L.Insert(0,i);}
      }

   // update d and p
   while (!L.IsEmpty()) {// more paths exist
      // find vertex *v in L with least d
      int *v = I.Initialize(L);
      int *w = I.Next();
      while (w) {
         if (d[*w] < d[*v]) v = w;
         w = I.Next();}

      // next shortest path is to vertex *v
      // delete from L and update d
      int i = *v;
      L.Delete(*v);
      for (int j = 1; j <= n; j++) {
         if (a[i][j] != NoEdge && (!p[j] ||
   	             d[j] > d[i] + a[i][j])) {
            // d[j] decreases
            d[j] = d[i] + a[i][j];
            // add j to L if not already in L
            if (!p[j]) L.Insert(0,j);
            p[j] = i;}
         }
      }
}
    
template<class T>
void AdjacencyWDigraph<T>::AllPairs(T **c, int **kay)
{// All pairs shortest paths.
 // Compute c[i][j] and kay[i][j] for all i and j.
   // initialize c[i][j] = c(i,j,0)
   for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
         c[i][j] = a[i][j];
         kay[i][j] = 0;
         }
   for (int i = 1; i <= n; i++)
      c[i][i] = 0;
   
   // compute c[i][j] = c(i,j,k)
   for (int k = 1; k <= n; k++)
      for (int i = 1; i <= n; i++)
         for (int j = 1; j <= n; j++) {
            T t1 = c[i][k];
            T t2 = c[k][j];
            T t3 = c[i][j];
            if (t1 != NoEdge && t2 != NoEdge &&
               (t3 == NoEdge || t1 + t2 < t3)) {
                 c[i][j] = t1 + t2;
                 kay[i][j] = k;}
            }
}

template<class T>
void AdjacencyWDigraph<T>::tSP(int i)
{// Backtracking code for traveling salesperson.
   if (i == n) {// at parent of a leaf
      // complete tour by adding last two edges
      if (a[x[n-1]][x[n]] != NoEdge &&
         a[x[n]][1] != NoEdge &&
         (cc + a[x[n-1]][x[n]] + a[x[n]][1] < bestc ||
         bestc == NoEdge)) {// better tour found
         for (int j = 1; j <= n; j++)
            bestx[j] = x[j];
         bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];}
      }
   else {// try out subtrees
      for (int j = i; j <= n; j++)
         // is move to subtree labeled x[j] possible?
         if (a[x[i-1]][x[j]] != NoEdge &&
               (cc + a[x[i-1]][x[i]] < bestc ||
                bestc == NoEdge)) {// yes
            // search this subtree
            Swap(x[i], x[j]);
            cc += a[x[i-1]][x[i]];
            tSP(i+1);
            cc -= a[x[i-1]][x[i]];
            Swap(x[i], x[j]);}
      }
}

template<class T>
T AdjacencyWDigraph<T>::TSP(int v[])
{// Traveling salesperson by backtracking.
 // Return cost of best tour, return tour in v[1:n].
   // initialize for tSP
   x = new int [n+1];
   // x is identity permutation
   for (int i = 1; i <= n; i++)
      x[i] = i;
   bestc = NoEdge;
   bestx = v;  // use array v to store best tour
   cc = 0;

   // search permutations of x[2:n]
   tSP(2);

   delete [] x;
   return bestc;
}

#include "minheap.h"
template<class T>
class MinHeapNode {
   friend AdjacencyWDigraph<T>;
   public:
      operator T () const {return lcost;}
   private:
      T lcost,  // lower bound on cost of tours in subtree
        cc,     // cost of partial tour
        rcost;  // min additional cost to complete tour
      int s,    // partial tour is x[0:s]
          *x;   // vertex array, x[s+1:n-1] gives remaining
                // vertices to be added to partial tour x[0:s]
};

template<class T>
T AdjacencyWDigraph<T>::BBTSP(int v[])
{// Min cost branch-and-bound
 // traveling-salesperson code.
   // define a max heap for up to
   // 1000 live nodes
   MinHeap<MinHeapNode<T> > H(1000);

   T *MinOut = new T [n+1];
   // compute MinOut[i] = cost of min-cost edge
   // leaving vertex i
   T MinSum = 0;  // sum of min-cost out edges
   for (int i = 1; i <= n; i++) {
      T Min = NoEdge;
      for (int j = 1; j <= n; j++)
         if (a[i][j] != NoEdge && 
                 (a[i][j] < Min || Min == NoEdge))
            Min = a[i][j];
      if (Min == NoEdge) return NoEdge; // no route
      MinOut[i] = Min;
      MinSum += Min;
      }

   // initial E-node is tree root
   MinHeapNode<T> E;
   E.x = new int [n];
   for (i = 0; i < n; i++)
      E.x[i] = i + 1;
   E.s = 0;           // partial tour is x[1:0]
   E.cc = 0;          // its cost is zero
   E.rcost = MinSum;  // will go up by this or more
   T bestc = NoEdge;  // no tour found so far

   // search permutation tree
   while (E.s < n - 1) {// not at leaf
      if (E.s == n - 2) {// parent of leaf
         // complete tour by adding 2 edges
         // see if new tour is better
         if (a[E.x[n-2]][E.x[n-1]] != NoEdge &&
             a[E.x[n-1]][1] != NoEdge && (E.cc +
             a[E.x[n-2]][E.x[n-1]] + a[E.x[n-1]][1]
             < bestc || bestc == NoEdge)) {
             // better tour found
             bestc = E.cc + a[E.x[n-2]][E.x[n-1]]
                          + a[E.x[n-1]][1];
             E.cc = bestc;
             E.lcost = bestc;
             E.s++;
             H.Insert(E);}
         else delete [] E.x;}  // done with E-node
      else {// generate children
         for (int i = E.s + 1; i < n; i++)
            if (a[E.x[E.s]][E.x[i]] != NoEdge) {
               // feasible child, bound path cost
               T cc = E.cc + a[E.x[E.s]][E.x[i]];
               T rcost = E.rcost - MinOut[E.x[E.s]];
               T b = cc + rcost;  // lower bound
               if (b < bestc || bestc == NoEdge) {
                   // subtree may have better leaf
                   // save root in max heap
                   MinHeapNode<T> N;
                   N.x = new int [n];
                   for (int j = 0; j < n; j++)
                      N.x[j] = E.x[j];
                   N.x[E.s+1] = E.x[i];
                   N.x[i] = E.x[E.s+1];
                   N.cc = cc;
                   N.s = E.s + 1;
                   N.lcost = b;
                   N.rcost = rcost;
                   H.Insert(N);}
               }  // end of feasible child
         delete [] E.x;}  // done with this node

      try {H.DeleteMin(E);}        // get next E-node
      catch (...) {break;} // no nodes left
      }

   if (bestc == NoEdge) return NoEdge; // no route
   // copy best route into v[1:n]
   for (i = 0; i < n; i++)
      v[i+1] = E.x[i];

   while (true) {// free all nodes in min heap
      delete [] E.x;
      try {H.DeleteMin(E);}
      catch (...) {break;}
      }

   return bestc;
}

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲一区三区| 欧美激情综合在线| 国产人久久人人人人爽| 亚洲国产精品影院| 国产精品99久久久久久久vr| 欧美日韩免费不卡视频一区二区三区| 日韩精品一区在线观看| 亚洲综合色噜噜狠狠| 国产精品一区二区三区网站| 欧美男人的天堂一二区| 国产精品女上位| 国产在线国偷精品产拍免费yy| 欧美性猛片xxxx免费看久爱| 亚洲国产激情av| 国产精品1024| 久久久久久毛片| 久久99精品国产麻豆不卡| 欧美日韩国产综合一区二区三区| 中文字幕日韩一区| aaa国产一区| 国产精品久久久久9999吃药| 国产制服丝袜一区| 欧美电视剧在线观看完整版| 天天色天天操综合| 欧洲一区在线电影| 一级做a爱片久久| 日本道免费精品一区二区三区| 综合久久给合久久狠狠狠97色| 懂色av一区二区三区蜜臀 | 在线观看免费一区| 亚洲精品免费在线| 色噜噜狠狠色综合欧洲selulu| 中文字幕在线不卡一区| 99久久99久久综合| 亚洲精品国产一区二区三区四区在线| 99这里都是精品| 一区二区三区鲁丝不卡| 欧洲中文字幕精品| 三级在线观看一区二区| 91超碰这里只有精品国产| 日本v片在线高清不卡在线观看| 欧美精品久久99| 久久丁香综合五月国产三级网站| 精品国产乱码久久久久久图片| 国产真实乱偷精品视频免| 中文字幕欧美日韩一区| 色偷偷成人一区二区三区91| 一区二区三区不卡在线观看 | 日本韩国欧美一区二区三区| 亚洲精品伦理在线| 欧美精品三级日韩久久| 极品美女销魂一区二区三区免费| 国产日韩av一区二区| 一本到高清视频免费精品| 午夜精品久久久久久久| 精品久久久久久久久久久久包黑料| 国产曰批免费观看久久久| 国产精品成人网| 91精品久久久久久蜜臀| 国产一二三精品| 亚洲综合在线五月| 欧美成人vr18sexvr| 成人自拍视频在线| 五月激情综合色| 久久精品视频一区| 在线观看日韩高清av| 麻豆精品久久精品色综合| 国产日韩欧美麻豆| 欧美日韩国产大片| 成人亚洲精品久久久久软件| 亚洲一区二区三区四区不卡 | 欧美日韩国产区一| 国产精品一区在线| 午夜国产精品影院在线观看| 国产精品麻豆网站| 日韩视频永久免费| 色婷婷香蕉在线一区二区| 久久99精品视频| 一区二区三区久久| 国产欧美综合在线观看第十页| 精品视频999| 99久久伊人久久99| 激情另类小说区图片区视频区| 一区二区三区免费看视频| 久久久久久一二三区| 欧美乱熟臀69xxxxxx| www.欧美亚洲| 国产成人h网站| 久久99在线观看| 偷窥少妇高潮呻吟av久久免费| 中文字幕一区二区三区蜜月| 久久综合久久综合久久| 69堂亚洲精品首页| 欧美亚洲日本一区| 91网上在线视频| 9i看片成人免费高清| 国产成人亚洲综合a∨猫咪| 久久电影网电视剧免费观看| 日韩av在线发布| 香蕉乱码成人久久天堂爱免费| 亚洲美女屁股眼交| 国产精品成人免费| 中文字幕五月欧美| 国产精品久久久久一区二区三区共| 久久久精品tv| 国产婷婷色一区二区三区在线| 欧美v日韩v国产v| 日韩精品一区在线观看| 日韩免费性生活视频播放| 欧美精品乱人伦久久久久久| 在线日韩国产精品| 欧美亚洲高清一区| 欧美午夜电影在线播放| 欧美日韩在线播放三区四区| 欧美视频在线播放| 欧美日韩成人一区| 欧美一二三区精品| 日韩精品综合一本久道在线视频| 日韩午夜在线观看视频| 精品久久久久久久人人人人传媒| 精品国产电影一区二区| 久久综合久久综合九色| 中文字幕av一区二区三区高| 中文字幕在线视频一区| 一区二区三区在线视频观看58| 亚洲人成在线观看一区二区| 亚洲综合精品久久| 日韩高清在线电影| 美女网站一区二区| 国产乱子伦视频一区二区三区| 国产激情一区二区三区桃花岛亚洲| 国产激情一区二区三区| 一本大道综合伊人精品热热| 欧美日韩精品综合在线| 久久综合九色综合97婷婷女人| 亚洲国产成人在线| 亚洲成人av电影在线| 精品影视av免费| 成人av资源网站| 欧美日韩久久久| 国产午夜精品一区二区三区嫩草 | 欧美精品一区二区三区久久久| 国产午夜精品福利| 亚洲最大的成人av| 国产一区二区三区黄视频 | 中文字幕字幕中文在线中不卡视频| 亚洲精品伦理在线| 久久精品99国产精品| 波多野洁衣一区| 69久久夜色精品国产69蝌蚪网| 久久久91精品国产一区二区精品| 亚洲欧洲av一区二区三区久久| 五月婷婷综合网| 成人永久免费视频| 69精品人人人人| 日韩久久一区二区| 激情六月婷婷综合| 欧美视频在线一区| 中文字幕精品三区| 日产精品久久久久久久性色| 成人黄色777网| 日韩欧美精品在线视频| 亚洲一区免费在线观看| 国产成人免费视频精品含羞草妖精| 在线视频国内自拍亚洲视频| 久久久久国产精品麻豆| 五月天中文字幕一区二区| 不卡视频一二三| 欧美videossexotv100| 夜夜嗨av一区二区三区| 本田岬高潮一区二区三区| 欧美电视剧在线看免费| 午夜欧美电影在线观看| 91麻豆精品秘密| 国产精品毛片a∨一区二区三区| 久久av老司机精品网站导航| 欧美群妇大交群中文字幕| 亚洲欧美经典视频| 菠萝蜜视频在线观看一区| 久久蜜桃av一区精品变态类天堂| 日韩黄色一级片| 欧美日韩视频第一区| 一区二区三区国产精品| 99久久精品99国产精品 | 亚洲成a天堂v人片| 色婷婷香蕉在线一区二区| 中文字幕亚洲精品在线观看| 国产麻豆成人精品| 久久中文字幕电影| 国产一区二区h| 久久精品视频免费观看| 国产精品一区二区黑丝| 欧美精品一区在线观看| 国内精品嫩模私拍在线| 久久尤物电影视频在线观看| 国产在线一区二区综合免费视频| 日韩一级大片在线| 九九精品视频在线看| 精品卡一卡二卡三卡四在线| 久久精品国产成人一区二区三区|