diff --git a/DataStructureAndAlgorithm/17 图.md b/DataStructureAndAlgorithm/17 图.md new file mode 100644 index 0000000..4fa76e6 --- /dev/null +++ b/DataStructureAndAlgorithm/17 图.md @@ -0,0 +1,1293 @@ + +# 17 ͼ + +**֪ʶ½á¹¹£º** + + +![ͼ1 ֪ʶ½á¹¹](https://img-blog.csdnimg.cn/20201108112251166.png) + + +--- + +## 1. ͼµÄ»ù±¾¸ÅÄîÓëÊõÓï + +### 1.1 ͼµÄ¶¨Òå + +ͼÓɶ¥µã¼¯ºÍ±ß¼¯×é³É£¬¼ÇΪ $G=(V,E)$¡£ +- ¶¥µã¼¯£º¶¥µãµÄÓÐÇî·Ç¿Õ¼¯ºÏ£¬¼ÇΪ$V(G)$¡£ +- ±ß¼¯£º¶¥µãż¶ÔµÄÓÐÇºÏ£¬¼ÇΪ$E(G)$ ¡£ + +±ß£º +- ÎÞÏò±ß£º$(v_i,v_j)=(v_j,v_i)$ +- ÓÐÏò±ß£¨»¡£©£º$ \neq $ ʼµã$v_i$³ÆÎª»¡Î²£¬ÖÕµã$v_j$³ÆÎª»¡Í·¡£ + +ÀýÌ⣺ + +![ͼ2 ͼµÄ±íʾ](https://img-blog.csdnimg.cn/20201106202532801.png) + + +ÀýÌ⣺ + +![ͼ3 ͼµÄ±íʾ](https://img-blog.csdnimg.cn/20201106202637934.png) + +### 1.2 ͼµÄ·ÖÀà + +- ÓÐÏòͼ£º$E(G)$ÓÉÓÐÏò±ß¹¹³É¡£ +- ÎÞÏòͼ£º$E(G)$ÓÉÎÞÏò±ß¹¹³É¡£ + +### 1.3 ͼÖж¥µãÊýÓë±ßÊýµÄ¹ØÏµ + +£¨1£©Éè¶¥µãÊýΪ$n$£¬±ßÊýΪ$e$Ôò£º + +- ÎÞÏòͼ£º$0\leq e \leq \frac{n(n-1)}{2}$£¬$e=\frac{n(n-1)}{2}$µÄͼ³ÆÎªÎÞÏòÍêȫͼ¡£ +- ÓÐÏòͼ£º$0\leq e \leq n(n-1)$£¬$e = n(n-1)$µÄͼ³ÆÎªÓÐÏòÍêȫͼ¡£ + +£¨2£©¶¥µãµÄ¶È + +- ÎÞÏòͼ£º$D(v)=$Óë$v$Á¬½ÓµÄ±ßÊý¡£ +- ÓÐÏòͼ£º$D(v)=ID(v)+OD(v)$ + - $ID(v)$£ºÒÔ$v$ΪÖյ㣨»¡Í·£©µÄ±ßÊý¡£ + - $OD(v)$£ºÒÔ$v$ΪÆðµã£¨»¡Î²£©µÄ±ßÊý¡£ + +£¨3£©¶ÈÓë±ßµÄ¹ØÏµ + + +$$ +e=\frac{\sum_{i=1}^{n}D(v_i)}{2} +$$ + +£¨4£©ÕýÔòͼ£ºËùÓж¥µãµÄ¶È¶¼ÏàͬµÄͼ + +![ͼ4 ÕýÔòͼ](https://img-blog.csdnimg.cn/20201106203517590.png) + + +### 1.4 ·¾¶ + +£¨1£©¶¨Ò壺ͼ$G=(V,E)$£¬Èô´æÔÚÒ»¸ö¶¥µãÐòÁÐ $v_p,v_{i1},v_{i2},\cdots,v_{im},v_q$£¬Ê¹µÃ$(v_p,v_{i1}),(v_{i1},v_{i2}),\cdots,(v_{im},v_q)\in E(G)$£¨ÎÞÏòͼ£©»òÕß$ ,,\cdots,\in E(G)$£¨ÓÐÏòͼ£©Ôò³Æ$v_p$µ½$v_q$´æÔÚÒ»Ìõ·¾¶¡£ + +£¨2£©Â·¾¶µÄ³¤¶È£ºÂ·¾¶ÉϱߵÄÊýÄ¿¡£ + +£¨3£©¼òµ¥Â·¾¶£ºÈôÒ»Ìõ·¾¶Éϳý$v_p$£¬$v_q$¿ÉÏàͬÍ⣬ÆäÓà¶¥µã¾ù²»ÏàͬµÄ·¾¶¡£ + +£¨4£©¼òµ¥»ØÂ·£º$v_p$Óë$v_q$ÏàͬµÄ¼òµ¥Â·¾¶¡£ + +### 1.5 ×Óͼ +Éè$G=(V,E)$ÊÇÒ»¸öͼ£¬Èô$V'\subseteq V$£¬$E'\subseteq E$ÇÒ$E^{'}$ÖеıßËù¹ØÁªµÄ¶¥µã$\in V'$£¬Ôò$G'=(V',E')$ Ò²ÊÇÒ»¸öͼ£¬²¢³ÆÆäΪ$G$µÄ×Óͼ¡£ + +![ͼ5 ͼÓë×Óͼ](https://img-blog.csdnimg.cn/20201106204617379.png) + +### 1.6 Á¬Í¨Í¼ÓëÁ¬Í¨·ÖÁ¿£¨ÎÞÏòͼ£© + +Á¬Í¨Í¼£ºÎÞÏòͼ$G$µÄ$V(G)$ÖУ¬ÈκÎÁ½¸ö¶¥µã¶¼´æÔÚ·¾¶£¬Ôò³Æ$G$ΪÁ¬Í¨Í¼¡£ + +Á¬Í¨·ÖÁ¿£ºÎÞÏòͼ$G$µÄ¼«´óÁ¬Í¨×Óͼ¡£ + +×¢£º + +- Á¬Í¨Í¼µÄÁ¬Í¨·ÖÁ¿Ö»ÓÐÒ»¸ö£¬ÎªÆä±¾Éí¡£ +- ·ÇÁ¬Í¨Í¼µÄÁ¬Í¨·ÖÁ¿²»Î¨Ò»¡£ + +Àý×Ó£º + +![ͼ6 Á¬Í¨Í¼ÓëÁ¬Í¨·ÖÁ¿](https://img-blog.csdnimg.cn/20201106204848603.png) + +### 1.7 Ç¿Á¬Í¨Í¼ÓëÇ¿Á¬Í¨·ÖÁ¿£¨ÓÐÏòͼ£© + +Ç¿Á¬Í¨Í¼£ºÓÐÏòͼ$G$µÄ$V(G)$ÖУ¬ÈκÎÁ½¸ö¶¥µã¶¼´æÔÚ·¾¶£¬Ôò³Æ$G$ΪǿÁ¬Í¨Í¼¡£ + +Ç¿Á¬Í¨·ÖÁ¿£ºÓÐÏòͼ$G$µÄ¼«´óÁ¬Í¨×Óͼ¡£ + +×¢£º +- Ç¿Á¬Í¨Í¼µÄÇ¿Á¬Í¨·ÖÁ¿Ö»ÓÐÒ»¸ö£¬ÎªÆä±¾Éí¡£ +- ·ÇÇ¿Á¬Í¨Í¼µÄÇ¿Á¬Í¨·ÖÁ¿²»Î¨Ò»¡£ + +Àý×Ó£º + +![ͼ7 Ç¿Á¬Í¨Í¼ÓëÇ¿ÁªÍ¨·ÖÁ¿](https://img-blog.csdnimg.cn/20201106205035361.png) + +### 1.8 ÍøÂç + +$E(G)$ÖеÄÿÌõ±ß¶¼´øÓÐȨֵµÄͼ³ÆÎªÍøÂç¡£ + +×¢£ºÈ¨Ò»°ã¾ßÓÐʵ¼ÊÒâÒ壬±ÈÈç¾àÀë¡¢ÏûºÄµÈ¡£ + +Àý×Ó£º + +![ͼ8 ÍøÂç](https://img-blog.csdnimg.cn/20201106205129363.png) + + +--- +## 2. ͼµÄ´æ´¢½á¹¹ + +### 2.1 ˳Ðò´æ´¢£¨ÁÚ½Ó¾ØÕó£© + +ÁÚ½Ó¾ØÕ󣺱íʾ¶¥µãÖ®¼äÏàÁÚ¹ØÏµµÄ¾ØÕó + +Èôͼ$G=(V,E)$£¬ÔòÆäÁÚ½Ó¾ØÕó¿É±íʾΪ£º + +$$ +A[i,j]=\begin{cases} +1, & (v_i,v_j)\in E(G) or \left\langle v_i,v_j \right\rangle \in E(G)\\ +0, & (v_i,v_j)\notin E(G) or \left\langle v_i,v_j \right\rangle \notin E(G) +\end{cases} +$$ + +Àý×Ó£ºÎÞÏòͼµÄ´æ´¢ + +![ͼ9 ÁÚ½Ó¾ØÕó´æ´¢ÎÞÏòͼ](https://img-blog.csdnimg.cn/20201106205902391.png) + + +Àý×Ó£ºÓÐÏòͼµÄ´æ´¢ + +![ͼ10 ÁÚ½Ó¾ØÕó´æ´¢ÓÐÏòͼ](https://img-blog.csdnimg.cn/20201106205934703.png) + +Èôͼ$G=(V,E)$ÎªÍøÂ磬ÔòÆäÁÚ½Ó¾ØÕó¿É±íʾΪ£º + + +$$ +A[i,j]=\begin{cases} +\omega_{ij}, & (v_i,v_j)\in E(G) or \left\langle v_i,v_j \right\rangle\in E(G)\\ +0 or \infty, & (v_i,v_j)\notin E(G) or \left\langle v_i,v_j \right\rangle\notin E(G) +\end{cases} +$$ + +Àý×Ó£ºÍøÂçµÄ´æ´¢ + +![ͼ11 ÁÚ½Ó¾ØÕó´æ´¢ÍøÂç](https://img-blog.csdnimg.cn/20201106210322224.png) + +![ͼ12 MGraph½á¹¹](https://img-blog.csdnimg.cn/20201106210702707.png) + + +```c +using System; +namespace NonLinearStruct.Graph +{ + /// + /// ͼ³éÏóÊý¾ÝÀàÐÍʵÏÖ--ÀûÓÃÁÚ½Ó¾ØÕó + /// + public class MGraph + { + private readonly double[,] _adMatrix;//ÁÚ½Ó¾ØÕó + private readonly string[] _vertexNameList;//´æ´¢Í¼Öи÷½áµãÃû×ÖµÄÊý×é + + /// + /// »ñȡͼÖнáµãµÄ¸öÊý + /// + public int VertexCount { get; } + + /// + /// ³õʼ»¯MGraphÀàµÄÐÂʵÀý + /// + /// ͼÖнáµãµÄ¸öÊý + public MGraph(int vCount) + { + if (vCount <= 0) + throw new ArgumentOutOfRangeException(); + + VertexCount = vCount; + _vertexNameList = new string[vCount]; + _adMatrix = new double[vCount, vCount]; + } + + /// + /// »ñÈ¡»òÉèÖÃͼÖи÷½áµãµÄÃû³Æ + /// + /// ½áµãÃû³Æ´ÓÁ㿪ʼµÄË÷Òý + /// Ö¸¶¨Ë÷Òý´¦½áµãµÄÃû³Æ + public string this[int index] + { + get + { + if (index < 0 || index > VertexCount - 1) + throw new IndexOutOfRangeException(); + return _vertexNameList[index]; + } + set + { + if (index < 0 || index > VertexCount - 1) + throw new IndexOutOfRangeException(); + _vertexNameList[index] = value; + } + } + + private int GetIndex(string vertexName) + { + //¸ù¾Ý½áµãÃû×Ö»ñÈ¡½áµãÔÚÊý×éÖеÄϱê + int i; + for (i = 0; i < VertexCount; i++) + { + if (_vertexNameList[i] == vertexName) + break; + } + return i == VertexCount ? -1 : i; + } + + /// + /// ¸øÁÚ½Ó¾ØÕó¸³Öµ + /// + /// Æðʼ½áµãµÄÃû×Ö + /// ÖÕÖ¹½áµãµÄÃû×Ö + /// ±ßÉϵÄȨֵ»òÁ¬½Ó¹ØÏµ + public void AddEdge(string startVertexName, string endVertexName, double weight = 1) + { + int i = GetIndex(startVertexName); + int j = GetIndex(endVertexName); + if (i == -1 || j == -1) + throw new Exception("ͼÖв»´æÔڸñß."); + _adMatrix[i, j] = weight; + } + } +} +``` + + + +### 2.2 Á´Ê½´æ´¢£¨ÁÚ½Ó±í£© + +ÁÚ½Ó±í£ºÓÉ˳Ðò´æ´¢µÄ¶¥µã±íºÍÁ´Ê½´æ´¢µÄ±ß±í¹¹³ÉµÄͼµÄ´æ´¢½á¹¹¡£ + +Àý×Ó£ºÎÞÏòͼµÄ´æ´¢ + +![ͼ13 ÎÞÏòͼµÄ´æ´¢](https://img-blog.csdnimg.cn/20201106210912939.png) + +Àý×Ó£ºÓÐÏòͼµÄ´æ´¢ + +![ͼ14 ÓÐÏòͼµÄ´æ´¢](https://img-blog.csdnimg.cn/2020110621102015.png) + + +Àý×Ó£ºÍøÂçµÄ´æ´¢ + +![ͼ15 ÍøÂçµÄ´æ´¢](https://img-blog.csdnimg.cn/2020110621111817.png) + +±ß±í½áµãµÄʵÏÖ£º + +![ͼ16 ±ß±í½áµã½á¹¹](https://img-blog.csdnimg.cn/20201106211252949.png) + +![ͼ17 EdgeNode½á¹¹](https://img-blog.csdnimg.cn/20201106211415100.png) + +```c +using System; +namespace NonLinearStruct.Graph +{ + /// + /// ÁÚ½Ó±í±ß±íÉϵĽáµã + /// + public class EdgeNode + { + /// + /// »ñÈ¡±ßÖÕµãÔÚ¶¥µãÊý×éÖеÄλÖà + /// + public int Index { get; } + + /// + /// »ñÈ¡±ßÉϵÄȨֵ + /// + public double Weight { get; } + + /// + /// »ñÈ¡»òÉèÖÃÏÂÒ»¸öÁÚ½Óµã + /// + public EdgeNode Next { get; set; } + + /// + /// ³õʼ»¯EdgeNodeÀàµÄÐÂʵÀý + /// + /// ±ßÖÕµãÔÚ¶¥µãÊý×éÖеÄλÖà + /// ±ßÉϵÄȨֵ + /// ÏÂÒ»¸öÁÚ½Óµã + public EdgeNode(int index, double weight = 0.0, EdgeNode next = null) + { + if (index < 0) + throw new ArgumentOutOfRangeException(); + + Index = index; + Weight = weight; + Next = next; + } + } +} +``` + +¶¥µã±í½áµãµÄʵÏÖ£º + +![ͼ18 ¶¥µã±í½áµã½á¹¹](https://img-blog.csdnimg.cn/20201106211512903.png) + +![ͼ19 VertextNode½á¹¹](https://img-blog.csdnimg.cn/20201106211657496.png) + +```c +namespace NonLinearStruct.Graph +{ + /// + /// ÁÚ½Ó±í¶¥µã±íÖеĽáµã + /// + public class VertexNode + { + /// + /// »ñÈ¡»òÉèÖö¥µãµÄÃû×Ö + /// + public string VertexName { get; set; } + + /// + /// »ñÈ¡»òÉèÖö¥µãÊÇ·ñ±»·ÃÎÊ + /// + public bool Visited { get; set; } + + /// + /// »ñÈ¡»òÉèÖö¥µãµÄµÚÒ»¸öÁÚ½Óµã + /// + public EdgeNode FirstNode { get; set; } + + /// + /// ³õʼ»¯VertexNodeÀàµÄÐÂʵÀý + /// + /// ¶¥µãµÄÃû×Ö + /// ¶¥µãµÄµÚÒ»¸öÁÚ½Óµã + public VertexNode(string vName, EdgeNode firstNode = null) + { + VertexName = vName; + Visited = false; + FirstNode = firstNode; + } + } +} +``` + +ͼ½á¹¹µÄʵÏÖ + +![ͼ20 AdGraph½á¹¹](https://img-blog.csdnimg.cn/20201106211947741.png) + +```c +using System; +using System.Collections.Generic; +using System.Linq; +using LinearStruct; + +namespace NonLinearStruct.Graph +{ + /// + /// ͼ³éÏóÊý¾ÝÀàÐÍʵÏÖ--ÀûÓÃÁÚ½Ó±í + /// + public class AdGraph + { + private readonly VertexNode[] _vertexList; //½áµã±í + + /// + /// »ñȡͼµÄ½áµãÊý + /// + public int VertexCount { get; } + + /// + /// ³õʼ»¯AdGraphÀàµÄÐÂʵÀý + /// + /// ͼÖнáµãµÄ¸öÊý + public AdGraph(int vCount) + { + if (vCount <= 0) + throw new ArgumentOutOfRangeException(); + + VertexCount = vCount; + _vertexList = new VertexNode[vCount]; + } + + /// + /// »ñÈ¡»òÉèÖÃͼÖи÷½áµãµÄÃû³Æ + /// + /// ½áµãÃû³Æ´ÓÁ㿪ʼµÄË÷Òý + /// Ö¸¶¨Ë÷Òý´¦½áµãµÄÃû³Æ + public string this[int index] + { + get + { + if (index < 0 || index > VertexCount - 1) + throw new ArgumentOutOfRangeException(); + + return _vertexList[index] == null + ? "NULL" + : _vertexList[index].VertexName; + } + set + { + if (index < 0 || index > VertexCount - 1) + throw new ArgumentOutOfRangeException(); + + if (_vertexList[index] == null) + _vertexList[index] = new VertexNode(value); + else + _vertexList[index].VertexName = value; + } + } + + /// + /// µÃµ½½áµãÔÚ½áµã±íÖеÄλÖà + /// + /// ½áµãµÄÃû³Æ + /// ½áµãµÄλÖà + private int GetIndex(string vertexName) + { + int i; + for (i = 0; i < VertexCount; i++) + { + if (_vertexList[i] != null && _vertexList[i].VertexName == vertexName) + break; + } + return i == VertexCount ? -1 : i; + } + + /// + /// ¸øÍ¼¼Ó±ß + /// + /// Æðʼ½áµãµÄÃû×Ö + /// ÖÕÖ¹½áµãµÄÃû×Ö + /// ±ßÉϵÄȨֵ + public void AddEdge(string startVertexName, string endVertexName, double weight = 0.0) + { + int i = GetIndex(startVertexName); + int j = GetIndex(endVertexName); + + if (i == -1 || j == -1) + throw new Exception("ͼÖв»´æÔڸñß."); + + EdgeNode temp = _vertexList[i].FirstNode; + if (temp == null) + { + _vertexList[i].FirstNode = new EdgeNode(j, weight); + } + else + { + while (temp.Next != null) + temp = temp.Next; + temp.Next = new EdgeNode(j, weight); + } + } + } +} +``` + +--- +## 3. ͼµÄ±éÀú +### 3.1 Éî¶ÈÓÅÏÈËÑË÷ + +Ëã·¨£º + +¼ÙÉè$G=(V,E)$ÒÔ$S$ΪÆðµã£¨Ô´µã£©½øÐÐËÑË÷¡£ + +Ê×Ïȱêʶ$S$ΪÒÑ·ÃÎʽáµã£¬½Ó×ÅѰÕÒÓë$S$ÏàÁڵĽáµã$\omega$£¬Èô$\omega$ÊÇδ±»·ÃÎʽáµã£¬ÔòÒÔ$\omega$ΪÆðµã½øÐÐÉî¶ÈÓÅÏÈËÑË÷£¬Èô$\omega$ÊÇÒѱ»·ÃÎʽáµã£¬ÔòѰÕÒÆäËüÓë$S$ÏàÁڵĽáµã£¬Ö±µ½Óë$S$Óз¾¶ÏàͨµÄËùÓнáµã¶¼±»·ÃÎʹý¡£ + +Àý×Ó£º + +![ͼ21 ͼµÄ½á¹¹](https://img-blog.csdnimg.cn/20201106212721439.png) + +Éî¶ÈÓÅÏÈËÑË÷µÄÐòÁÐΪ£º$V_0,V_1,V_3,V_7,V_4,V_5,V_2,V_6$ + +ËäÈ»±éÀúÐòÁв»Î¨Ò»£¬µ«ÊÇÁÚ½Ó±íÈ·¶¨ºó£¬±éÀúÐòÁоÍΨһÁË¡£ + +ʵÏÖ£º + +![ͼ22 AdGraph½á¹¹](https://img-blog.csdnimg.cn/20201106213043485.png) + + + +```c +private void Dfs(int i, ref string dfsResult) +{ + //Éî¶ÈÓÅÏÈËÑË÷µÝ¹éº¯Êý + _vertexList[i].Visited = true; + dfsResult += _vertexList[i].VertexName + "\n"; + + EdgeNode p = _vertexList[i].FirstNode; + while (p != null) + { + if (_vertexList[p.Index].Visited) + p = p.Next; + else + Dfs(p.Index, ref dfsResult); + } +} + +/// +/// µÃµ½Éî¶ÈÓÅÏÈËÑË÷ÐòÁÐ +/// +/// ½øÐÐÉî¶ÈÓÅÏÈËÑË÷µÄÆðʼµãÃû³Æ +/// Éî¶ÈÓÅÏÈËÑË÷ÐòÁÐ +public string DfsTraversal(string startVertexName) +{ + string dfsResult = string.Empty; + int i = GetIndex(startVertexName); + if (i != -1) + { + for (int j = 0; j < VertexCount; j++) + _vertexList[j].Visited = false; + Dfs(i, ref dfsResult); + } + return dfsResult; +} +``` + +### 3.2 ¹ã¶ÈÓÅÏÈËÑË÷ + +Ëã·¨£º + +¼ÙÉè$G=(V,E)$ÒÔ$S$ΪÆðµã£¨Ô´µã£©½øÐÐËÑË÷¡£ + +Ê×Ïȱêʶ$S$ΪÒÑ·ÃÎʽáµã£¬½Ó×Å·ÃÎÊ$S$µÄÁÚ½Óµã$\omega_1,\omega_2,\cdots,\omega_t$È»ºó·ÃÎÊ$\omega_1,\omega_2,\cdots,\omega_t$µÄδ±»·ÃÎʵÄÁڽӵ㣬ÒÔ´ËÀàÍÆ£¬Ö±µ½Óë$S$Óз¾¶ÏàÁ¬µÄËùÓнáµã¶¼±»·ÃÎʵ½¡£ + +ÏÈÀ´ÏÈ·þÎñµÄ˼Ïë¡£ + +Àý×Ó£º + +![ͼ23 ͼµÄ½á¹¹](https://img-blog.csdnimg.cn/20201106213215211.png) + +Éî¶ÈÓÅÏÈËÑË÷µÄÐòÁÐΪ£º$V_0,V_1,V_2,V_3,V_4,V_5,V_6,V_7$ + +ËäÈ»±éÀúÐòÁв»Î¨Ò»£¬µ«ÊÇÁÚ½Ó±íÈ·¶¨ºó£¬±éÀúÐòÁоÍΨһÁË¡£ + + +ʵÏÖ£º + +![ͼ24 AdGraph½á¹¹](https://img-blog.csdnimg.cn/20201106213551207.png) + +```c +/// +/// µÃµ½¹ã¶ÈÓÅÏÈËÑË÷ÐòÁÐ +/// +/// ½øÐйã¶ÈÓÅÏÈËÑË÷µÄÆðʼµãÃû³Æ +/// ¹ã¶ÈÓÅÏÈËÑË÷ÐòÁÐ +public string BfsTraversal(string startNodeName) +{ + string bfsResult = string.Empty; + int i = GetIndex(startNodeName); + if (i != -1) + { + for (int j = 0; j < VertexCount; j++) + _vertexList[j].Visited = false; + + _vertexList[i].Visited = true; + bfsResult += _vertexList[i].VertexName + "\n"; + LinkQueue lq = new LinkQueue(); + lq.EnQueue(i); + while (lq.IsEmpty() == false) + { + int j = lq.QueueFront; + lq.DeQueue(); + EdgeNode p = _vertexList[j].FirstNode; + while (p != null) + { + if (_vertexList[p.Index].Visited == false) + { + _vertexList[p.Index].Visited = true; + bfsResult += _vertexList[p.Index].VertexName + "\n"; + lq.EnQueue(p.Index); + } + p = p.Next; + } + } + } + return bfsResult; +} +``` + +--- +## 4. ÍØÆËÅÅÐò + +### 4.1 »ù±¾¸ÅÄî + +$AOV$Íø£¨Activity on Vertex Network£©£ºÓö¥µã±íʾ»î¶¯£¬ÓÃÓÐÏò±ß±íʾ»î¶¯Ö®¼äÏȺó¹ØÏµµÄÓÐÏòͼ¡£ + +ÍØÆËÐòÁУº°Ñ$AOV$ÍøÖеÄËùÓж¥µãÅųÉÒ»¸öÏßÐÔÐòÁУ¬Ê¹Ã¿¸ö»î¶¯µÄËùÓÐǰÇý»î¶¯¶¼ÅÅÔڸûµÄǰ±ß¡£ + +ÍØÆËÅÅÐò£º¹¹Ôì$AOV$ÍøÍØÆËÐòÁеĹý³Ì¡£ + +ÀýÌ⣺°´ÕÕÍØÆËÅÅÐò°²ÅÅÏÂÁÐ¿Î³Ì + +![ͼ25 ¿Î³Ì±í](https://img-blog.csdnimg.cn/20201107142129131.png) + +![ͼ26 AOVÍø](https://img-blog.csdnimg.cn/2020110714223963.png) + + +![ͼ27 AOVÍøµÄ´æ´¢](https://img-blog.csdnimg.cn/20201107142312104.png) + + +### 4.2 Ëã·¨²½Öè + +µÚ1²½£º´ÓÍøÖÐÑ¡ÔñÒ»¸öÈë¶ÈΪ0µÄ¶¥µã¼ÓÈëÅÅÐòÐòÁС£ + +µÚ2²½£º´ÓÍøÖÐɾ³ý¸Ã¶¥µã¼°ÆäËùÓгö±ß¡£ + +µÚ3²½£ºÖ´ÐеÚ1¡¢2²½£¬Ö±µ½ËùÓж¥µãÒÑÅÅÐò»òÍøÖÐÊ£Óà¶¥µãÈë¶È¾ù²»Îª0£¨ËµÃ÷£ºÍøÖдæÔÚ»ØÂ·£¬ÎÞ·¨¼ÌÐøÍØÆËÅÅÐò£©¡£ + +ÍØÆËÐòÁУº + +£¨1£©$V_0,V_1,V_4,V_6,V_2,V_3,V_7,V_5,V_8$ + +£¨2£©$V_0,V_6,V_1,V_2,V_3,V_4,V_5,V_8,V_7$ + +×¢£º¶ÔÓÚÈκÎÎÞ»ØÂ·µÄ$AOV$Íø£¬Æä¶¥µã¾ù¿ÉÅųÉÍØÆËÐòÁУ¬µ«ÆäÍØÆËÐòÁÐδ±ØÎ¨Ò»¡£ + +![ͼ28 ´æÔÚ»ØÂ·µÄAOVÍø](https://img-blog.csdnimg.cn/20201107142605197.png) + +´æÔÚ»ØÂ·µÄÓÐÏòͼ£¬²»Äܹ¹³ÉÍØÆËÐòÁС£ + +### 4.3 Ë㷨ʵÏÖ + +![ͼ29 AdGraph½á¹¹](https://img-blog.csdnimg.cn/20201107144220299.png) + +```c +/// +/// µÃµ½Ã¿¸ö½ÚµãµÄÈë¶È +/// +/// +private int[] GetInDegressList() +{ + int[] id = new int[VertexCount]; + for (int i = 0; i < VertexCount; i++) + { + EdgeNode p = _vertexList[i].FirstNode; + while (p != null) + { + id[p.Index]++; + p = p.Next; + } + } + return id; +} + +/// +/// µÃµ½AOVÍøµÄÍØÆËÅÅÐòÐòÁÐ +/// +/// AOVÍøµÄÍØÆËÅÅÐòÐòÁÐ +public string TopoSort() +{ + string result = string.Empty; + int[] id = GetInDegressList(); + LinkQueue lq = new LinkQueue(); + for (int i = 0; i < VertexCount; i++) + { + if (id[i] == 0) + lq.EnQueue(i); + } + + if (lq.Length == VertexCount) + throw new Exception("´ËÓÐÏòͼÎÞÓÐÏò±ß."); + + while (lq.IsEmpty() == false) + { + int j = lq.QueueFront; + lq.DeQueue(); + result += _vertexList[j].VertexName + "\n"; + + EdgeNode p = _vertexList[j].FirstNode; + while (p != null) + { + id[p.Index]--; + if (id[p.Index] == 0) + { + lq.EnQueue(p.Index); + } + p = p.Next; + } + } + int k; + for (k = 0; k < VertexCount; k++) + { + if (id[k] != 0) + { + break; + } + } + return (k == VertexCount) ? result : "¸ÃAOVÍøÓл·."; +} +``` + + +--- +## 5. ×îСÉú³ÉÊ÷ + +### 5.1 »ù±¾¸ÅÄî + +Éú³ÉÊ÷£ºÉè$G$ΪÁ¬Í¨Íø£¬¾ßÓÐ$G$µÄËùÓж¥µã£¨$n$¸ö£©ÇÒÖ»ÓÐ$n-1$Ìõ±ßµÄÁ¬Í¨×ÓÍø¡£ + +Ê÷µÄȨ£ºÉú³ÉÊ÷$T$µÄ¸÷±ßµÄȨֵ×ܺ͡£ + +×îСÉú³ÉÊ÷£ºÈ¨Öµ×îСµÄÉú³ÉÊ÷¡£ + +### 5.2 PrimËã·¨ + +Ëã·¨Ô­Àí£¨Ì°ÐÄËã·¨£©£º + +Éè$G=(V,E)$ΪÁ¬Í¨Íø£¬$T=(U,TE)$ΪÆä¶ÔÓ¦µÄ×îСÉú³ÉÊ÷£¬´Ó$v_0$¿ªÊ¼¹¹Ôì¡£ + +£¨1£©¿ªÊ¼Ê±£¬$U = \lbrace u_0=v_0 \rbrace$£¬$TE=\Phi$¡£ + +£¨2£©ÕÒµ½Âú×ã$weight(u,v)=min \lbrace weight(u_i,v_j)|u_i \in U,v_j\in V-U \rbrace$µÄ±ß£¬°ÑËü²¢Èë$TE$ÖУ¬$v$ͬʱ²¢Èë$U$¡£ + +£¨3£©·´¸´Ö´ÐУ¨2£©£¬Ö±µ½$U=V$ʱ£¬ÖÕÖ¹Ëã·¨¡£ + +ÀýÌ⣺ + +![ͼ30 Á¬Í¨Í¼](https://img-blog.csdnimg.cn/20201107144310220.png) + +![ͼ31 Á¬Í¨Í¼µÄ´æ´¢](https://img-blog.csdnimg.cn/20201107144446641.png) + +![ͼ32 ×îСÉú³ÉÊ÷µÄ¹¹½¨](https://img-blog.csdnimg.cn/2020110714453692.png) + + +Ë㷨ʵÏÖ£º + +×îСÉú³ÉÊ÷½áµãµÄ´æ´¢£º + +![ͼ33 ×îСÉú³ÉÊ÷½áµãµÄ½á¹¹](https://img-blog.csdnimg.cn/20201107144815248.png) + + +![ͼ34 SpanTreeNode½á¹¹](https://img-blog.csdnimg.cn/20201107145414373.png) + + + + + + + + + + + + + +```c +using System; + +namespace NonLinearStruct +{ + /// + /// Éú³ÉÊ÷½áµãµÄ³éÏóÊý¾ÝÀàÐÍ + /// + public class SpanTreeNode + { + /// + /// »ñÈ¡»òÉèÖýáµã±¾ÉíµÄÃû³Æ + /// + public string SelfName { get; } + + /// + /// »ñÈ¡»òÉèÖýáµãË«Ç×µÄÃû³Æ + /// + public string ParentName { get; } + + /// + /// »ñÈ¡»òÉèÖñߵÄȨֵ + /// + public double Weight { get; set; } + + /// + /// ¹¹ÔìSpanTreeNodeʵÀý + /// + /// ½áµã±¾ÉíµÄÃû³Æ + /// ½áµãË«Ç×µÄÃû³Æ + /// ±ßµÄȨֵ + public SpanTreeNode(string selfName, string parentName, double weight) + { + if (string.IsNullOrEmpty(selfName) || string.IsNullOrEmpty(parentName)) + throw new ArgumentNullException(); + + SelfName = selfName; + ParentName = parentName; + Weight = weight; + } + } +} +``` + +![ͼ35 AdGraph½á¹¹](https://img-blog.csdnimg.cn/2020110714553012.png) + +```c +/// +/// µÃµ½Á¬Í¨ÍøµÄ×îСÉú³ÉÊ÷PrimËã·¨ +/// +/// Ê÷¸ù½áµã +/// Á¬Í¨ÍøµÄ×îСÉú³ÉÊ÷ +public SpanTreeNode[] MiniSpanTree(string vName) +{ + int i = GetIndex(vName); + if (i == -1) + return null; + + SpanTreeNode[] spanTree = new SpanTreeNode[VertexCount]; + spanTree[0] = new SpanTreeNode(_vertexList[i].VertexName, "NULL", 0.0); + + //UÖнáµãµ½¸÷½áµã×îСȨֵÄǸö½áµãÔÚVertexListÖеÄË÷ÒýºÅ + int[] vertexIndex = new int[VertexCount]; + //UÖнáµãµ½¸÷¸ö½áµãµÄ×îСȨֵ + double[] lowCost = new double[VertexCount]; + for (int j = 0; j < VertexCount; j++) + { + lowCost[j] = double.MaxValue; + vertexIndex[j] = i; + } + + EdgeNode p1 = _vertexList[i].FirstNode; + while (p1 != null) + { + lowCost[p1.Index] = p1.Weight; + p1 = p1.Next; + } + vertexIndex[i] = -1; + + for (int count = 1; count < VertexCount; count++) + { + double min = double.MaxValue; + int v = i; + for (int k = 0; k < VertexCount; k++) + { + if (vertexIndex[k] != -1 && lowCost[k] < min) + { + min = lowCost[k]; + v = k; + } + } + spanTree[count] = new SpanTreeNode(_vertexList[v].VertexName, _vertexList[vertexIndex[v]].VertexName, min); + vertexIndex[v] = -1; + + EdgeNode p2 = _vertexList[v].FirstNode; + while (p2 != null) + { + if (vertexIndex[p2.Index] != -1 && p2.Weight < lowCost[p2.Index]) + { + lowCost[p2.Index] = p2.Weight; + vertexIndex[p2.Index] = v; + } + p2 = p2.Next; + } + } + return spanTree; +} +``` + +### 5.3 KruskarËã·¨ + +Éè$G=(V,E)$ΪÁ¬Í¨Íø£¬$T$ΪÆä¶ÔÓ¦µÄ×îСÉú³ÉÊ÷¡£ + +£¨1£©³õʼʱ$T=\lbrace V, \lbrace \Phi \rbrace \rbrace$£¬¼´$T$ÖÐûÓбߣ¬Ö»ÓÐ$n$¸ö¶¥µã£¬¾ÍÊÇ$n$¸öÁ¬Í¨·ÖÁ¿¡£ + +£¨2£©ÔÚ$E$ÖÐÑ¡ÔñȨֵ×îСµÄ±ß$(u,v)$£¬²¢½«´Ë±ß´Ó$E$ÖÐɾ³ý¡£ + +£¨3£©Èç¹û$u$£¬$v$ÔÚ$T$µÄ²»Í¬µÄÁ¬Í¨·ÖÁ¿ÖУ¬Ôò½«$(u,v)$¼ÓÈëµ½$T$ÖУ¬´Ó¶øµ¼ÖÂ$T$ÖмõÉÙÒ»¸öÁ¬Í¨·ÖÁ¿¡£ + +£¨4£©·´¸´Ö´ÐУ¨2£©£¨3£©Ö±µ½$T$ÖнöÊ£Ò»¸öÁ¬Í¨·ÖÁ¿Ê±£¬ÖÕÖ¹²Ù×÷¡£ + +ÀýÌ⣺ + +![ͼ36 ×îСÉú³ÉÊ÷µÄ¹¹½¨](https://img-blog.csdnimg.cn/20201107174120263.png) + + +![ͼ37 Á¬Í¨Í¼µÄ´æ´¢](https://img-blog.csdnimg.cn/20201107174257367.png) + +![ͼ38 ±ßµÄ¼¯ºÏ](https://img-blog.csdnimg.cn/20201107174426131.png) + +Ë㷨ʵÏÖ£º + +![ͼ39 Edge½á¹¹](https://img-blog.csdnimg.cn/20201107174553303.png) + + +```c +namespace NonLinearStruct.Graph +{ + /// + /// ±íʾͼµÄ±ß + /// + public class Edge + { + /// + /// Æðµã±àºÅ + /// + public int Begin { get; } + + /// + /// ÖÕµã±àºÅ + /// + public int End { get; } + + /// + /// Ȩֵ + /// + public double Weight { get; } + + /// + /// ´´½¨Ò»¸ö Edge ÀàµÄÐÂʵÀý + /// + /// Æðµã±àºÅ + /// ÖÕµã±àºÅ + /// Ȩֵ + public Edge(int begin, int end, double weight = 0.0) + { + Begin = begin; + End = end; + Weight = weight; + } + } +} +``` + +![ͼ40 AdGraph½á¹¹](https://img-blog.csdnimg.cn/2020110717501562.png) + +```c +private Edge[] GetEdges() +{ + for (int i = 0; i < VertexCount; i++) + _vertexList[i].Visited = false; + + List result = new List(); + + for (int i = 0; i < VertexCount; i++) + { + _vertexList[i].Visited = true; + EdgeNode p = _vertexList[i].FirstNode; + while (p != null) + { + if (_vertexList[p.Index].Visited == false) + { + Edge edge = new Edge(i, p.Index, p.Weight); + result.Add(edge); + } + p = p.Next; + } + } + return result.OrderBy(a => a.Weight).ToArray(); +} + +private int Find(int[] parent, int f) +{ + while (parent[f] > -1) + f = parent[f]; + return f; +} + +/// +/// ¿Ë³˹¿¨¶ûËã·¨ ×îСÉú³ÉÊ÷ +/// +/// +public SpanTreeNode[] MiniSpanTree() +{ + int[] parent = new int[VertexCount]; + for (int i = 0; i < VertexCount; i++) + { + parent[i] = -1; + } + SpanTreeNode[] tree = new SpanTreeNode[VertexCount]; + Edge[] edges = GetEdges(); + + int count = 1; + for (int i = 0; i < edges.Length; i++) + { + int begin = edges[i].Begin; + int end = edges[i].End; + int b = Find(parent, begin); + int e = Find(parent, end); + if (b != e) + { + parent[e] = b; + tree[count] = new SpanTreeNode(_vertexList[end].VertexName, + _vertexList[begin].VertexName, edges[i].Weight); + count++; + } + } + for (int i = 0; i < parent.Length; i++) + { + if (parent[i] == -1) + { + tree[0] = new SpanTreeNode(_vertexList[i].VertexName, "NULL", 0.0); + break; + } + } + return tree; +} +``` + +--- +## 6. µ¥Ô´×î¶Ì·¾¶ + +### 6.1 ¶¨Òå +Éè$G=(V,E)$ΪÁ¬Í¨Íø£¬$v$ΪԴµã£¬$v$µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶ÎÊÌ⼴Ϊµ¥Ô´×î¶Ì·¾¶ÎÊÌâ¡£ + + +### 6.2 µÏ½ÜÌØËºÀ­Ëã·¨ + +$Dijkstra$£¨µÏ½ÜÌØË¹À­£©Ëã·¨£¨°´Â·¾¶³¤¶ÈµÝÔö˳Ðò¹¹ÔìµÄËã·¨£©£º + +³õʼʱ$s$ΪԴµã£¬$D_s=0$£¬$D_i= + \infty (i \neq s)$ £¬±êʶ$s$±»·ÃÎÊ¡£ + +£¨1£©Áî$v=s$£¬$D_v=0$£¨$v$µ½$s$µÄ·¾¶³¤¶È£©¡£ + +£¨2£©ÒÀ´Î¿¼²ì$v$µÄδ±»·ÃÎʵÄÁÚ½Óµã$\omega$£¬Èô$D_v+weight(v,\omega) +/// µ¥Ô´×î¶Ì·¾¶ +/// +/// ѰÕÒ×î¶Ì·¾¶µÄÔ´µã +/// Ô´µãµ½¸÷¸ö¶¥µãµÄ×î¶Ì·¾¶ +public string ShortestPath(string vName) +{ + int v = GetIndex(vName); + if (v == -1) + { + return string.Empty; + } + + string result = string.Empty; + double[] dist = new double[VertexCount]; + string[] path = new string[VertexCount]; + //³õʼ»¯ + for (int i = 0; i < VertexCount; i++) + { + _vertexList[i].Visited = false; + dist[i] = double.MaxValue; + path[i] = _vertexList[v].VertexName; + } + dist[v] = 0.0; + _vertexList[v].Visited = true; + + for (int i = 0; i < VertexCount - 1; i++) + { + EdgeNode p = _vertexList[v].FirstNode; + while (p != null) + { + if (_vertexList[p.Index].Visited == false + && dist[v] + p.Weight < dist[p.Index]) + { + dist[p.Index] = dist[v] + p.Weight; + path[p.Index] = path[v] + " ->" + _vertexList[p.Index].VertexName; + } + p = p.Next; + } + + double min = double.MaxValue; + for (int j = 0; j < VertexCount; j++) + { + if (_vertexList[j].Visited == false && dist[j] < min) + { + min = dist[j]; + v = j; + } + } + _vertexList[v].Visited = true; + } + + for (int i = 0; i < VertexCount; i++) + { + result += path[i] + ":" + dist[i] + "\n"; + } + + return result; +} +``` + + +--- +## 7. Á¬Í¨·ÖÁ¿ + +ÀýÌ⣺ + +![ͼ45 ԭʼͼ](https://img-blog.csdnimg.cn/2020110719092686.png) + +![ͼ46 ͼµÄ´æ´¢½á¹¹](https://img-blog.csdnimg.cn/20201107190953404.png) + +¿ÉÀûÓÃÉî¶ÈÓÅÏÈËÑË÷£¬Çó·ÇÁ¬Í¨Í¼µÄÁ¬Í¨·ÖÁ¿¡£ + +µÚÒ»¸ö£ºA£¬B£¬D£¬C£»µÚ¶þ¸ö£ºE£¬F£»µÚÈý¸ö£ºG£¬H£¬I + +Ë㷨ʵÏÖ£º + +![ͼ47 AdGraph½á¹¹](https://img-blog.csdnimg.cn/20201107191212105.png) + +```c +/// +/// µÃµ½Á¬Í¨·ÖÁ¿ +/// +/// Á¬Í¨·ÖÁ¿ +public string ConnectedComponent() +{ + string result; + SLinkList lst = new SLinkList(); + + for (int i = 0; i < VertexCount; i++) + _vertexList[i].Visited = false; + + for (int i = 0; i < VertexCount; i++) + { + if (_vertexList[i].Visited == false) + { + result = string.Empty; + //ÀûÓÃÉî¶ÈÓÅÏÈËÑË÷Çó·ÇÁ¬Í¨Í¼µÄÁ¬Í¨·ÖÁ¿ + Dfs(i, ref result); + lst.InsertAtRear(result); + } + } + result = string.Empty; + for (int i = 0; i < lst.Length; i++) + { + result += "µÚ" + i + "¸öÁ¬Í¨·ÖÁ¿Îª:\n" + lst[i]; + } + return result; +} +``` + +--- +## 8. Á·Ï° + +¸ù¾ÝÒªÇóÍê³É³ÌÐò´úÂ룺 + +¸ø¶¨Å¦Ô¼Êи½½üµÄÒ»·ù¼òµ¥µØÍ¼£¬Í¼ÖеĶ¥µãΪ³ÇÊУ¬ÎÞÏò±ß´ú±íÁ½¸ö³ÇÊеÄÁ¬Í¨¹ØÏµ£¬±ßÉϵÄȨΪÁ½³ÇÊÐÖ®¼äµÄ¾àÀë¡£ + +![ͼ48 ŦԼÊи½½üµØÍ¼](https://img-blog.csdnimg.cn/20201107192151266.png) + +£¨1£©¶Ô¸Ãͼ½øÐÐÉî¶ÈÓÅÏȺ͹ã¶ÈÓÅÏÈËÑË÷£¬²¢Êä³öËÑË÷ÐòÁУ¨Í¼µÄËÑË÷ÎÊÌ⣩¡£ + +£¨2£©ÔÚ·ÖÎöÕâÕÅͼºó¿ÉÒÔ·¢ÏÖ£¬ÈÎÒ»¶Ô³ÇÊж¼ÊÇÁ¬Í¨µÄ¡£ + +µÚÒ»¸öÎÊÌâÊÇ£ºÒªÓù«Â·°ÑËùÓгÇÊÐÁ¬½ÓÆðÀ´£¬ÈçºÎÉè¼Æ¿ÉʹµÃ¹¤³ÌµÄ×ÜÔì¼Û×îÉÙ£¨×îСÉú³ÉÊ÷ÎÊÌ⣩¡£ + +µÚ¶þ¸öÎÊÌâÊÇ£ºÒª¿ª³µ´ÓÒ»¸ö³ÇÊе½ÁíÍâÒ»¸ö³ÇÊÐÇóÆä×î¶Ì¾àÀëÒÔ¼°Çý³µÂ·Ïߣ¨×î¶Ì·¾¶ÎÊÌ⣩¡£ + + +½â´ð£º + +Êý¾ÝTXTÎļþ£º +```c +Source,Target,Weight +San Rapheal,Cross,12 +San Rapheal,Oakland,18 +Cross,Daly Cit,3 +Cross,San Franciso,3 +Daly Cit,San Franciso,4 +Daly Cit,Cross B,19 +San Franciso,Oakland,7 +San Franciso,San Mateo,21 +Oakland,San Iarenzo,18 +Oakland,Dublin,31 +San Iarenzo,Hayward,3 +San Iarenzo,Dublin,12 +Cross B,San Mateo,4 +Cross B,Cross C,7 +San Mateo,Hayward,13 +San Mateo,Redwood City,6 +Hayward,Freemont,9 +Dublin,San Jose,35 +Redwood City,Cross C,5 +Redwood City,Palo Alto,6 +Cross C,Cupertin,14 +Palo Alto,Freemont,9 +Palo Alto,Mtn View,6 +Freemont,San Jose,24 +Mtn View,Cupertin,6 +Mtn View,San Jose,8 +Cupertin,San Jose,7 +``` + + +Éî¶ÈÓÅÏÈËÑË÷ÐòÁУº +```c +San Rapheal +Cross +Daly Cit +San Franciso +Oakland +San Iarenzo +Hayward +San Mateo +Cross B +Cross C +Redwood City +Palo Alto +Freemont +San Jose +Dublin +Mtn View +Cupertin +``` + +¹ã¶ÈÓÅÏÈËÑË÷ÐòÁУº + +```c +San Rapheal +Cross +Oakland +Daly Cit +San Franciso +San Iarenzo +Dublin +Cross B +San Mateo +Hayward +San Jose +Cross C +Redwood City +Freemont +Mtn View +Cupertin +Palo Alto +``` + +×îСÉú³ÉÊ÷£º + +```c +(NULL,San Rapheal) Weight:0 +(San Rapheal,Cross) Weight:12 +(Cross,Daly Cit) Weight:3 +(Cross,San Franciso) Weight:3 +(San Franciso,Oakland) Weight:7 +(Oakland,San Iarenzo) Weight:18 +(San Iarenzo,Hayward) Weight:3 +(Hayward,Freemont) Weight:9 +(Freemont,Palo Alto) Weight:9 +(Palo Alto,Redwood City) Weight:6 +(Redwood City,Cross C) Weight:5 +(Redwood City,San Mateo) Weight:6 +(San Mateo,Cross B) Weight:4 +(Palo Alto,Mtn View) Weight:6 +(Mtn View,Cupertin) Weight:6 +(Cupertin,San Jose) Weight:7 +(San Iarenzo,Dublin) Weight:12 + +×îСÉú³ÉÊ÷Ȩֵ£º116 +``` + +×î¶Ì·¾¶£º + +```c +San Rapheal:0 +San Rapheal ->Cross:12 +San Rapheal ->Oakland:18 +San Rapheal ->Cross ->Daly Cit:15 +San Rapheal ->Cross ->San Franciso:15 +San Rapheal ->Cross ->Daly Cit ->Cross B:34 +San Rapheal ->Cross ->San Franciso ->San Mateo:36 +San Rapheal ->Oakland ->San Iarenzo:36 +San Rapheal ->Oakland ->San Iarenzo ->Dublin:48 +San Rapheal ->Oakland ->San Iarenzo ->Hayward:39 +San Rapheal ->Cross ->Daly Cit ->Cross B ->Cross C:41 +San Rapheal ->Cross ->San Franciso ->San Mateo ->Redwood City:42 +San Rapheal ->Oakland ->San Iarenzo ->Hayward ->Freemont:48 +San Rapheal ->Cross ->San Franciso ->San Mateo ->Redwood City ->Palo Alto ->Mtn View ->San Jose:62 +San Rapheal ->Cross ->San Franciso ->San Mateo ->Redwood City ->Palo Alto:48 +San Rapheal ->Cross ->Daly Cit ->Cross B ->Cross C ->Cupertin:55 +San Rapheal ->Cross ->San Franciso ->San Mateo ->Redwood City ->Palo Alto ->Mtn View:54 +``` +