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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? graph_algorithms_code.txt

?? book: Algorithms in C++, Part 5 (Graph Algorithms) code
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
        This file contains the code from "Algorithms in C++, Third Edition,        Part 5," by Robert Sedgewick, and is covered under the copyright        and warranty notices in that book. Permission is granted for this        code to be used for educational purposes in association with the text,        and for other uses not covered by copyright laws, provided that        the following notice is included with the code:                "This code is from "Algorithms in C++, Third Edition,"                by Robert Sedgewick, Addison-Wesley, 2002."        Commercial uses of this code require the explicit written        permission of the publisher. Send your request for permission,        stating clearly what code you would like to use, and in what        specific way, to: aw.cse@aw.com----------CHAPTER 17. Graph Properties and Types-----struct Edge   { int v, w;    Edge(int v = -1, int w = -1) : v(v), w(w) { }  };class GRAPH  { private:      // Implementation-dependent code    public:      GRAPH(int, bool);      ~GRAPH();      int V() const;      int E() const;      bool directed() const;      int insert(Edge);      int remove(Edge);      bool edge(int, int);      class adjIterator        {           public:            adjIterator(const GRAPH &, int);            int beg();            int nxt();            bool end();        };  };-----template <class Graph> vector <Edge> edges(Graph &G)  { int E = 0;    vector <Edge> a(G.E());     for (int v = 0; v < G.V(); v++)       {        typename Graph::adjIterator A(G, v);        for (int w = A.beg(); !A.end(); w = A.nxt())           if (G.directed() || v < w)            a[E++] = Edge(v, w);      }    return a;  }-----template <class Graph> void IO<Graph>::show(const Graph &G)  {     for (int s = 0; s < G.V(); s++)       {        cout.width(2); cout << s << ":";        typename Graph::adjIterator A(G, s);        for (int t = A.beg(); !A.end(); t = A.nxt())           { cout.width(2); cout << t << " "; }        cout << endl;      }  }-----template <class Graph> class IO  {    public:      static void show(const Graph &);      static void scanEZ(Graph &);      static void scan(Graph &);  };-----template <class Graph> class CC  {     private:      // implementation-dependent code    public:      CC(const Graph &);      int count();      bool connect(int, int);  };-----#include <iostream.h>#include <stdlib.h>#include "GRAPH.cc"#include "IO.cc"#include "CC.cc"main(int argc, char *argv[]){ int V = atoi(argv[1]);  GRAPH G(V);  IO<GRAPH>::scan(G);  if (V < 20) IO<GRAPH>::show(G);  cout << G.E() << " edges ";  CC<GRAPH> Gcc(G);  cout << Gcc.count() << " components" << endl;}-----class DenseGRAPH{ int Vcnt, Ecnt; bool digraph;  vector <vector <bool> > adj;public:  DenseGRAPH(int V, bool digraph = false) :    adj(V), Vcnt(V), Ecnt(0), digraph(digraph)    {       for (int i = 0; i < V; i++)         adj[i].assign(V, false);    }  int V() const { return Vcnt; }  int E() const { return Ecnt; }  bool directed() const { return digraph; }  void insert(Edge e)    { int v = e.v, w = e.w;      if (adj[v][w] == false) Ecnt++;      adj[v][w] = true;      if (!digraph) adj[w][v] = true;     }   void remove(Edge e)    { int v = e.v, w = e.w;      if (adj[v][w] == true) Ecnt--;      adj[v][w] = false;      if (!digraph) adj[w][v] = false;     }   bool edge(int v, int w) const     { return adj[v][w]; }  class adjIterator;  friend class adjIterator;};-----class DenseGRAPH::adjIterator{ const DenseGRAPH &G;  int i, v;public:  adjIterator(const DenseGRAPH &G, int v) :     G(G), v(v), i(-1) { }  int beg()    { i = -1; return nxt(); }  int nxt()    {      for (i++; i < G.V(); i++)        if (G.adj[v][i] == true) return i;      return -1;    }  bool end()    { return i >= G.V(); }};-----class SparseMultiGRAPH{ int Vcnt, Ecnt; bool digraph;  struct node    { int v; node* next;      node(int x, node* t) { v = x; next = t; }    };  typedef node* link;  vector <link> adj;public:  SparseMultiGRAPH(int V, bool digraph = false) :    adj(V), Vcnt(V), Ecnt(0), digraph(digraph)     { adj.assign(V, 0); }  int V() const { return Vcnt; }  int E() const { return Ecnt; }  bool directed() const { return digraph; }  void insert(Edge e)    { int v = e.v, w = e.w;      adj[v] = new node(w, adj[v]);      if (!digraph) adj[w] = new node(v, adj[w]);       Ecnt++;    }   void remove(Edge e);  bool edge(int v, int w) const;   class adjIterator;  friend class adjIterator;};-----class SparseMultiGRAPH::adjIterator{ const SparseMultiGRAPH &G;  int v;  link t;public:  adjIterator(const SparseMultiGRAPH &G, int v) :     G(G), v(v) { t = 0; }  int beg()    { t = G.adj[v]; return t ? t->v : -1; }  int nxt()    { if (t) t = t->next; return t ? t->v : -1; }  bool end()    { return t == 0; }};-----template <class Graph> class DEGREE{ const Graph &G;  vector <int> degree; public:  DEGREE(const Graph &G) : G(G), degree(G.V(), 0)     {       for (int v = 0; v < G.V(); v++)      { typename Graph::adjIterator A(G, v);        for (int w = A.beg(); !A.end(); w = A.nxt())           degree[v]++;      }    }  int operator[](int v) const     { return degree[v]; }};-----static void randE(Graph &G, int E)  {     for (int i = 0; i < E; i++)      {        int v = int(G.V()*rand()/(1.0+RAND_MAX));        int w = int(G.V()*rand()/(1.0+RAND_MAX));        G.insert(Edge(v,w));      }  }-----static void randG(Graph &G, int E)  { double p = 2.0*E/G.V()/(G.V()-1);    for (int i = 0; i < G.V(); i++)      for (int j = 0; j < i; j++)        if (rand() < p*RAND_MAX)          G.insert(Edge(i, j));  }-----#include "ST.cc"template <class Graph> void IO<Graph>::scan(Graph &G)  { string v, w;    ST st;    while (cin >> v >> w)      G.insert(Edge(st.index(v), st.index(w)));  }-----#include <string>class ST { int N, val;  struct node     { int v, d; node* l, *m, *r;      node(int d) : v(-1), d(d), l(0), m(0), r(0) {}    };  typedef node* link;  link head;  link indexR(link h, const string &s, int w)    { int i = s[w];      if (h == 0) h = new node(i);      if (i == 0)         {          if (h->v == -1) h->v = N++;          val = h->v;          return h;        }      if (i < h->d) h->l = indexR(h->l, s, w);      if (i == h->d) h->m = indexR(h->m, s, w+1);      if (i > h->d) h->r = indexR(h->r, s, w);      return h;    }public:  ST() : head(0), N(0) { }  int index(const string &key)    { head = indexR(head, key, 0); return val; }};-----template <class Graph> class sPATH{ const Graph &G;  vector <bool> visited;  bool found;   bool searchR(int v, int w)    {       if (v == w) return true;      visited[v] = true;      typename Graph::adjIterator A(G, v);      for (int t = A.beg(); !A.end(); t = A.nxt())         if (!visited[t])          if (searchR(t, w)) return true;      return false;    }public:  sPATH(const Graph &G, int v, int w) :     G(G), visited(G.V(), false)     { found = searchR(v, w); }  bool exists() const     { return found; }};-----  bool searchR(int v, int w, int d)    {       if (v == w) return (d == 0);      visited[v] = true;      typename Graph::adjIterator A(G, v);      for (int t = A.beg(); !A.end(); t = A.nxt())         if (!visited[t])          if (searchR(t, w, d-1)) return true;      visited[v] = false;      return false;    }-----template <class Graph> class ePATH{ Graph G;  int v, w;  bool found;  STACK <int> S;  int tour(int v);public:  ePATH(const Graph &G, int v, int w) :     G(G), v(v), w(w)    { DEGREE<Graph> deg(G);      int t = deg[v] + deg[w];      if ((t % 2) != 0) { found = false; return; }      for (t = 0; t < G.V(); t++)        if ((t != v) && (t != w))          if ((deg[t] % 2) != 0)             { found = false; return; }      found = true;    }  bool exists() const     { return found; }  void show();};-----template <class Graph>int ePATH<Graph>::tour(int v)  {     while (true)       { typename Graph::adjIterator A(G, v);        int w = A.beg(); if (A.end()) break;        S.push(v);        G.remove(Edge(v, w));        v = w;      }    return v;  }template <class Graph>void ePATH<Graph>::show()    {       if (!found) return;      while (tour(v) == v && !S.empty())        { v = S.pop(); cout << "-" << v; }      cout << endl;        }----------CHAPTER 18. Graph Search-----#include <vector>template <class Graph> class cDFS{ int cnt;  const Graph &G;  vector <int> ord;   void searchC(int v)    {       ord[v] = cnt++;      typename Graph::adjIterator A(G, v);      for (int t = A.beg(); !A.end(); t = A.nxt())         if (ord[t] == -1) searchC(t);    }public:  cDFS(const Graph &G, int v = 0) :     G(G), cnt(0), ord(G.V(), -1)     { searchC(v); }  int count() const { return cnt; }  int operator[](int v) const { return ord[v]; }};-----template <class Graph> class SEARCH{  protected:    const Graph &G;    int cnt;    vector <int> ord;    virtual void searchC(Edge) = 0;    void search()      { for (int v = 0; v < G.V(); v++)          if (ord[v] == -1) searchC(Edge(v, v)); }  public:    SEARCH (const Graph &G) : G(G),       ord(G.V(), -1), cnt(0) { }    int operator[](int v) const { return ord[v]; }};-----template <class Graph> class DFS : public SEARCH<Graph> { vector<int> st;  void searchC(Edge e)    { int w = e.w;       ord[w] = cnt++; st[e.w] = e.v;      typename Graph::adjIterator A(G, w);      for (int t = A.beg(); !A.end(); t = A.nxt())         if (ord[t] == -1) searchC(Edge(w, t));    }public:  DFS(const Graph &G) : SEARCH<Graph>(G),     st(G.V(), -1) { search(); }   int ST(int v) const { return st[v]; }};-----template <class Graph> class CC{ const Graph &G;  int ccnt;  vector <int> id;   void ccR(int w)    {       id[w] = ccnt;      typename Graph::adjIterator A(G, w);      for (int v = A.beg(); !A.end(); v = A.nxt())         if (id[v] == -1) ccR(v);    }public:  CC(const Graph &G) : G(G), ccnt(0), id(G.V(), -1)     {       for (int v = 0; v < G.V(); v++)        if (id[v] == -1) { ccR(v); ccnt++; }     }  int count() const { return ccnt; }  bool connect(int s, int t) const     { return id[s] == id[t]; }};-----template <class Graph> class EULER : public SEARCH<Graph> {   void searchC(Edge e)  { int v = e.v, w = e.w;    ord[w] = cnt++;    cout << "-" << w;     typename Graph::adjIterator A(G, w);    for (int t = A.beg(); !A.end(); t = A.nxt())       if (ord[t] == -1) searchC(Edge(w, t));      else if (ord[t] < ord[v])        cout << "-" << t << "-" << w;    if (v != w) cout << "-" << v; else cout << endl;    }public:  EULER(const Graph &G) : SEARCH<Graph>(G)     { search(); }};-----template <class Graph> class BI{ const Graph &G;  bool OK;  vector <int> vc;   bool dfsR(int v, int c)    {       vc[v] = (c+1) %2;      typename Graph::adjIterator A(G, v);      for (int t = A.beg(); !A.end(); t = A.nxt())         if (vc[t] == -1)           { if (!dfsR(t, vc[v])) return false; }         else if (vc[t] != c) return false;      return true;    }public:  BI(const Graph &G) : G(G), OK(true), vc(G.V(),-1)     {       for (int v = 0; v < G.V(); v++)        if (vc[v] == -1)           if (!dfsR(v, 0)) { OK = false; return; }    }  bool bipartite() const { return OK; }  int color(int v) const { return vc[v]; }};-----template <class Graph> class EC : public SEARCH<Graph> { int bcnt;  vector <int> low;   void searchC(Edge e)  { int w = e.w;    ord[w] = cnt++; low[w] = ord[w];    typename Graph::adjIterator A(G, w);    for (int t = A.beg(); !A.end(); t = A.nxt())       if (ord[t] == -1)         {          searchC(Edge(w, t));          if (low[w] > low[t]) low[w] = low[t];          if (low[t] == ord[t])             bcnt++; // w-t is a bridge        }      else if (t != e.v)        if (low[w] > ord[t]) low[w] = ord[t];  }public:  EC(const Graph &G) : SEARCH<Graph>(G),     bcnt(0), low(G.V(), -1)    { search(); }  int count() const { return bcnt+1; }};-----#include "QUEUE.cc"template <class Graph> class BFS : public SEARCH<Graph> { vector<int> st;  void searchC(Edge e)  { QUEUE<Edge> Q;      Q.put(e);    while (!Q.empty())      if (ord[(e = Q.get()).w] == -1)       { int v = e.v, w = e.w;        ord[w] = cnt++; st[w] = v;                typename Graph::adjIterator A(G, w);        for (int t = A.beg(); !A.end(); t = A.nxt())           if (ord[t] == -1) Q.put(Edge(w, t));      }  }public:  BFS(Graph &G) : SEARCH<Graph>(G), st(G.V(), -1)     { search(); }  int ST(int v) const { return st[v]; }};-----  void searchC(Edge e)  { QUEUE<Edge> Q;    Q.put(e); ord[e.w] = cnt++;     while (!Q.empty())      {        e = Q.get(); st[e.w] = e.v;                typename Graph::adjIterator A(G, e.w);        for (int t = A.beg(); !A.end(); t = A.nxt())           if (ord[t] == -1)             { Q.put(Edge(e.w, t)); ord[t] = cnt++; }      }  }-----#include "GQ.cc"template <class Graph>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一卡二卡三卡四卡五卡| 欧美videos中文字幕| 中文字幕+乱码+中文字幕一区| 国产一区欧美二区| 久久久久久久性| 成人aa视频在线观看| 亚洲色图视频免费播放| 91黄色免费看| 日韩国产精品久久| 久久日韩粉嫩一区二区三区| 成人污污视频在线观看| 亚洲欧洲制服丝袜| 欧美精品日韩一区| 国产麻豆午夜三级精品| 国产精品人人做人人爽人人添| 91在线视频播放| 婷婷中文字幕一区三区| 亚洲精品在线电影| 99re这里只有精品6| 亚洲成人在线免费| 日韩精品一区二区三区在线 | 波多野结衣视频一区| 一区精品在线播放| 7777精品久久久大香线蕉 | 一区二区视频在线看| 欧美视频一二三区| 国内成人免费视频| 亚洲乱码国产乱码精品精小说| 欧美日韩一区三区四区| 国产一区二区三区免费播放| 亚洲色图在线播放| 日韩精品在线看片z| 91在线视频网址| 久久精品国产亚洲5555| 亚洲视频一二三区| 精品国精品国产尤物美女| 色又黄又爽网站www久久| 久久99在线观看| 亚洲综合免费观看高清在线观看| 日韩欧美你懂的| 91香蕉视频在线| 狠狠色丁香婷婷综合| 亚洲图片欧美一区| 国产精品嫩草影院com| 制服丝袜亚洲色图| 色综合色综合色综合色综合色综合| 日本va欧美va瓶| 亚洲愉拍自拍另类高清精品| 久久夜色精品一区| 91精品久久久久久久99蜜桃| 91婷婷韩国欧美一区二区| 国产一区二区调教| 日韩影院精彩在线| 亚洲女子a中天字幕| 国产亚洲精品7777| 欧美成人性战久久| 欧美精品777| 在线观看亚洲专区| 91亚洲永久精品| 懂色av一区二区三区免费看| 蜜桃av一区二区在线观看| 亚洲18色成人| 亚洲午夜三级在线| 亚洲免费观看在线视频| 国产精品视频一二三区 | 欧美亚洲国产bt| 国产69精品一区二区亚洲孕妇| 免费看精品久久片| 日本亚洲欧美天堂免费| 亚洲成人资源网| 亚洲不卡一区二区三区| 一区二区三区精品视频| 亚洲精品视频一区| 亚洲精品写真福利| 一区二区三区免费看视频| 亚洲视频一区在线| 亚洲精品中文在线影院| 洋洋av久久久久久久一区| 一个色综合av| 亚洲成a人片综合在线| 亚洲国产欧美另类丝袜| 午夜久久久影院| 日韩经典一区二区| 美女视频一区二区| 精品一区二区在线视频| 国产在线播放一区| 福利视频网站一区二区三区| 国产盗摄一区二区三区| 国产99久久久久久免费看农村| 国产精品99久久久久久宅男| 成人综合在线网站| 91色在线porny| 欧美日本一区二区三区四区| 欧美高清性hdvideosex| 亚洲精品一区二区三区精华液| 精品成人免费观看| 亚洲国产高清aⅴ视频| 亚洲视频免费观看| 日日摸夜夜添夜夜添亚洲女人| 日本亚洲天堂网| 岛国一区二区三区| 99国产精品99久久久久久| 欧美日韩一区二区三区免费看| 欧美一区二区精品在线| 国产清纯美女被跳蛋高潮一区二区久久w| 国产视频一区二区在线观看| 最好看的中文字幕久久| 五月激情六月综合| 国产电影一区二区三区| 91国产福利在线| 精品久久人人做人人爰| 国产精品久久看| 丝袜美腿高跟呻吟高潮一区| 国产一区欧美二区| 欧美亚洲一区三区| 精品国产免费人成在线观看| 最好看的中文字幕久久| 美女网站色91| 在线亚洲高清视频| 精品国产一区二区三区不卡| 亚洲卡通欧美制服中文| 精品一区二区成人精品| 在线观看亚洲精品| 久久一留热品黄| 丝袜美腿亚洲一区二区图片| 成人性视频免费网站| 久久精品亚洲精品国产欧美kt∨ | 国产精品毛片久久久久久| 图片区日韩欧美亚洲| 东方aⅴ免费观看久久av| 911精品国产一区二区在线| 国产精品久久久久桃色tv| 麻豆91小视频| 欧美日韩综合一区| 国产精品国产三级国产aⅴ中文| 日韩**一区毛片| 91丨porny丨国产入口| 久久婷婷国产综合国色天香| 亚洲6080在线| 色综合久久综合网| 国产精品视频免费| 九色porny丨国产精品| 欧美日韩黄色一区二区| 日韩一区在线播放| 国产传媒一区在线| 欧美变态口味重另类| 亚洲成a人片在线不卡一二三区| 波多野结衣中文一区| 久久蜜桃av一区精品变态类天堂| 丝袜亚洲另类欧美| 欧美日韩视频在线观看一区二区三区 | 午夜久久久影院| 一本色道久久加勒比精品| 中文字幕av一区二区三区| 国产精品自拍三区| 精品欧美乱码久久久久久1区2区 | 日韩欧美三级在线| 日韩专区在线视频| 欧美日韩一区二区三区视频| 一区二区三区欧美视频| 91麻豆福利精品推荐| 成人欧美一区二区三区| 成人激情午夜影院| 国产精品女人毛片| 成人av在线资源网站| 国产精品久久精品日日| 成人国产精品免费观看动漫 | 国产精品成人一区二区三区夜夜夜| 国产麻豆视频精品| 日本一区二区三区视频视频| 国产精品香蕉一区二区三区| 欧美精品一区二区久久久 | 国产一区二区视频在线播放| 欧美r级在线观看| 国产一区久久久| 国产片一区二区三区| 国产.欧美.日韩| 中文字幕制服丝袜一区二区三区 | 久久女同精品一区二区| 国产精品综合网| 国产精品久久久一本精品| 成人激情黄色小说| 亚洲色图制服丝袜| 欧美日韩在线播放| 美女视频网站久久| 国产亚洲一区字幕| www.性欧美| 亚洲高清视频中文字幕| 欧美一区二区视频在线观看2020| 美女任你摸久久 | 欧美精品亚洲一区二区在线播放| 午夜视黄欧洲亚洲| 亚洲精品在线免费播放| 成人动漫一区二区三区| 一个色综合av| 337p粉嫩大胆噜噜噜噜噜91av| 国产成a人无v码亚洲福利| 亚洲精品自拍动漫在线| 欧美一级生活片| www.66久久|