博文

Stein算法--转bpttc的发言(2007-04-20 12:23:00)

摘要:转自http://www.programfan.com/club/showbbs.asp?id=227318&page=1 bpttc的发言   int GCD_Stein( int x, int y )
{
        int factor = 0;
        int temp;

        if ( x < y )
        {
                temp = x;
                x = y;
                y = temp;
        }
        while ( x != y )
        {<......

阅读全文(2704) | 评论:0

四种寻路算法并比较 (2007-04-18 15:16:00)

摘要:四种寻路算法并比较
 
  好久没搞这些东西了...想了十分钟才勉强回忆起来...
写了三个钟头...好累啊...
四种算法是DFS,BFS,Heuristic DFS, Heuristic BFS (A*)
用了两张障碍表,一张是典型的迷宫: char Block[SY][SX]=
{{1,1,1,1,1,1,1,1,1,1,1 },
{1,0,1,0,1,0,0,0,0,0,1 },
{1,0,1,0,0,0,1,0,1,1,1 },
{1,0,0,0,1,0,1,0,0,0,1 },
{1,0,1,1,0,0,1,0,0,1,1 },
{1,0,1,0,1,1,0,1,0,0,1 },
{1,0,0,0,0,0,0,0,1,0,1 },
{1,0,1,0,1,0,1,0,1,0,1 },
{1,0,0,1,0,0,1,0,1,0,1 },
{1,1,1,1,1,1,1,1,1,1,1 }}; 第二张是删掉一些障碍后的: char Block[SY][SX]=
{{1,1,1,1,1,1,1,1,1,1,1 },
{1,0,1,0,1,0,0,0,0,0,1 },
{1,0,1,0,0,0,1,0,1,1,1 },
{1,0,0,0,0,0,1,0,0,0,1 },
{1,0,0,1,0,0,1,0,0,1,1 },
{1,0,1,0,0,1,0,1,0,0,1 },
{1,0,0,0,0,0,0,0,1,0,1 },
{1,0,1,0,0,0,1,0,1,0,1 },
{1,0,0,1,0,0,1,0,0,0,1 },
{1,1,1,1,1,1,1,1,1,1,1 }}; 结果:
尝试节点数 合法节点数 步数
深度优先 416/133 110/43 19/25
广度优先 190/188 48/49 19/15
深度+启发 283/39 82/22 19/19
广度+启发 189/185 48/49 19/15 所以可以看出深度+启发是最好的,效率高路径也挺短。A*第一是不真实二是慢三是空间消耗较大。 附:dfs+heu的源程序,bc++ 3.1通过 ......

阅读全文(3175) | 评论:0

一个图和其中两点.求出该两点间的所有路径 (2007-04-18 15:15:00)

摘要:一个图和其中两点.求出该两点间的所有路径   void lookingforway(graph g){
  bool visitedp[max]
  for (v=0;v<g.vertex_number; v  ) visited[v]=false;
  input your start point: special_vertex;
  visited[special_vertex]=true;
  for (v=first_adjacent_vertex(g,special_vertex);v; v=next_adjacent_vertex(g,v){
    if (!visited[v]){
      visited[v]=true;
      search(g,v);
    }
  }
}
void search(graph g, int v){
  visited[v]=true;
  if v=end_point {
    打印路径
    return;
  }
  for (w=first_adjacent_vertex(g,v);w;w=next_adjacent_vertex(g,v)){
    if (!visited[w]) search(g,w);
  }
} ......

阅读全文(5722) | 评论:1

图的相关算法(2007-04-18 15:15:00)

摘要:在广度优先搜索的基础上求图中两结点的最短路径需
1,将链队列的结点改为“双链”结点,即结点中包含next和priou两个指针;
2,修改入队列的操作,插入新的队尾结点时,令其priou域的指针指向刚刚出队列的结点,即当前的队头指针所指结点;
3,修改出队列的操作,出队列时,仅移动队头指针,而不将队头结点从链表中删除。

由于普里姆算法的时间复杂度为O( N的平方),则适于稠密图;而克鲁斯卡尔算法需对e条边按权值进行排序,其时间复杂度为o(eloge),则适于稀疏图。
7.5重(双)连通图和关节点
若从一个连通图中删去任何一个顶点及其相关联的边,它仍为一个连通图的话,则该连通图被称为重(双)连通图。
若连通图中的某个顶点和其相关联的边被删去之后,该连通图被分割成两个或两个以上的连通分量,则称此顶点为关节点。
没有关节点的连通图为双连通图。 关节点的特征:
    假设从某个顶点V出发对连通图进行深度优先搜索遍历,则可得到一棵深度优先生成树,树上包含图的所有顶点。
    若生成树的根结点,有两个或两个以上的分支,则此顶点(生成树的根)必为关节点;
    对生成树上的任意一个“顶点”,若其某棵子树的根或子树中的其它“顶点”没有和其祖先相通的回边,则该“顶点”必为关节点。 如何求关键点:
1)对根结点来说深度优先遍历看count是否小于结点数,如果小于则该根结点为关节点。
2)对生成树上的顶点定义一个函数:
low(v)=Min{visited[v],low[w],visited[k]}(k为和v有回边相通的顶点)
对顶点v,若(在生成树上)存在一个子树根w,且low[w]>=visited[v]则顶点v为关节点
对深度优先遍历算法作如下修改:
1,visited[v]的值改为遍历过程中顶点的访问次序count值
2,遍历过程中求得
low(v)=Min{visited[v],low[w],visited[k]}
3,从子树遍历返回时判别low[v]是否>=visited[v] 7.6两点之间的最短路径问题
从源点到其余各点的最短......

阅读全文(2512) | 评论:0

深度优先搜索算法(DFS)源代码(2007-04-18 15:12:00)

摘要:深度优先搜索算法(DFS)源代码,C++的, /*深度搜索,用邻接矩阵存储*/
void DFSTraverse(Graph *G)
{
int v;
for(v=1;v<=G->vexnum;v++)
visited[v]=false;
for(v=1;v<=G->vexnum;v++)
if(visited[v]==false)
DFS(G,v);
}
void DFS(Graph *G,int v)
{
int w;
visited[v]=true;
visitfunc(G,v);
for(w=FirstAdjex(G,v);w>=0;w=NextAdjex(G,v,w))
if(visited[w]==false)
DFS(G,w);
}

int FirstAdjex(Graph *G,int v)
{
int i;
for(i=1;i<=G->vexnum;i++)
if(G->Garr[v][i])
return i;
return -1;
}
int NextAdjex(Graph *G,int v,int w)
{
int i;
for(i=w+1;i<=G->vexnum;i++)
if(G->Garr[v][i])
return i;
return -1;
}
......

阅读全文(6646) | 评论:0

[算法] 算法总汇(2007-04-18 15:10:00)

摘要:路径问题
 
                     0/1边权最短路径
 
                     BFS
 
                     非负边权最短路径(Dijkstra)
 
                            可以用Dijkstra解决问题的特征
 
负边权最短路径
 
Bellman-Ford
 
Bellman-Ford的Yen-氏优化
 
差分约束系统
 
Floyd
 
广义路径问题
 
传递闭包
 
极小极大距离 / 极大极小距离
 
Euler Path / Tour
 
                      &n......

阅读全文(3986) | 评论:0