posts - 195,  comments - 30,  trackbacks - 0
#include<iostream>
using namespace std;
//求单源最小路径,不妨设源点为1,算法思想是
//从未访问的顶点中选择dv最小的点(d为从该点到源点0的距离)令arcs[v][v]=1
//考虑v的所有邻接顶点w,不断尝试若dv+weight(v,w)<dw,则改变dw值
//这里选择dv最小的很关键,因为最小,所以肯定是最短路径,其他的d会不断更新。
 #define  MaxVertx 100//最多边长度
 #define MAX 1e+8
 typedef char vertextype;
 typedef float adjtype;
 typedef struct{
  int n;//顶点个数
  vertextype vertex[MaxVertx];
  adjtype arcs[MaxVertx][MaxVertx];//邻接矩阵形式
 }Graph;
 typedef struct{
  vertextype vertex;//顶点信息
  adjtype length;//最小长度 
  int  prev;//最短路径上前驱结点编号
 }Path;
 Path dist[MaxVertx];
 Graph graph;
 void init(Graph *pgraph,Path dist[])
 {
  int i;
  dist[0].length=0;
  dist[0].prev=0;
  dist[0].vertex=pgraph->vertex[0];//第一个顶点的名称/编号
  pgraph->arcs[0][0]=1; /* 表示顶点v0在集合U中 */
  
   for(i = 1; i < pgraph->n; i++)              /* 初始化集合V-U中顶点的距离值 */
    {
    dist[i].length=pgraph->arcs[0][i];
    dist[i].vertex=pgraph->vertex[i];
    if(dist[i].length!=MAX)
         dist[i].prev=0;
    else
         dist[i].prev=-1;            
    }
 }
 void dijkstra(Graph graph,Path dist[])
 {
  int i,j,minvex;
  adjtype min;
  init(&graph,dist); /* 初始化,此时集合U中只有顶点v0*/
  for(i=1;i<graph.n;i++)//每个dist[]都要求 不一定会执行n次,可能会break出来
  {
   min=MAX;
   minvex=0;
   for(j=1;j<graph.n;j++)/*在VU中选出距离值最小顶点*/
   if(graph.arcs[j][j]==0&&dist[j].length<min)
   {
    min=dist[j].length;
    minvex=j;
   }
   if(minvex==0)break;/* 从v0没有路径可以通往集合VU中的顶点 */
   graph.arcs[minvex][minvex]=1;//表示已经访问过了,不属于VU集合
   for(j=1;j<graph.n;j++)
   {
    if(graph.arcs[j][j]==1)continue;
    if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j])//如果不相邻,则arcs[minvex][minvex]=+无穷
    {
                dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
                dist[j].prev = minvex;
        }
   }
  }
 }
 void initgraph()//初始化矩阵
 {
 int i,j;
    graph.n=6;
    for (i = 0; i < graph.n; i++)
        for (j = 0; j < graph.n; j++)
            graph.arcs[i][j] = (i == j ? 0 : MAX);
    graph.arcs[0][1] = 50;
    graph.arcs[0][2] = 10;
    graph.arcs[1][2] = 15;
    graph.arcs[1][4] = 5;
    graph.arcs[2][0] = 20;
    graph.arcs[2][3] = 15;
    graph.arcs[3][1] = 20;
    graph.arcs[3][4] = 35;
    graph.arcs[4][3] = 30;
    graph.arcs[5][3] = 3;
    graph.arcs[0][4] = 45; 
 }
  int main()
  {
  //freopen("s.txt","r",stdin);
  //freopen("key.txt","w",stdout);
   int i;
    initgraph();
    dijkstra(graph, dist);
    for (i = 0; i < graph.n; i++)
        printf("(%.0f %d)", dist[i].length,dist[i].prev);
    getchar();
 return 0;
  }
posted on 2009-08-09 11:19 luis 阅读(1589) 评论(1)  编辑 收藏 引用 所属分类: 图论*矩阵

FeedBack:
# re: dijkstra的邻接表实现[未登录]
2012-04-26 14:38 | alex
这是邻接矩阵好吗?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜