1.Prim算法生成最小生成树

//Prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G)
{
int min,i,j,k;
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0] = 0; adjvex[0] = 0;
for(i = 1;i < G.numVertexes;i++)
{
lowcost[i] = G.arc[0][i];
adjvex[i] = 0;
}
for(i = 1;i < G.numVertexes;i++)
{
min = INFINITY; j = 1;k = 0;
while(j < G.numVertexes)
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
j++;
} printf("(%d,%d)",adjvex[k],k);
lowcost[k] = 0;
for(j = i;j < G.numVertexes;j++)
{
if(lowcost[j]!=0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}
42
 
1
//Prim算法生成最小生成树
2
void MiniSpanTree_Prim(MGraph G)
3
{
4
    int min,i,j,k;
5
    int adjvex[MAXVEX];
6
    int lowcost[MAXVEX];
7
    lowcost[0] = 0;
8
    
9

10
    adjvex[0] = 0;
11
    for(i = 1;i < G.numVertexes;i++)
12
    {
13
        lowcost[i] = G.arc[0][i];
14
        adjvex[i] = 0;
15
    }
16
    for(i = 1;i < G.numVertexes;i++)
17
    {
18
        min = INFINITY;
19

20
        j = 1;k = 0;
21
        while(j < G.numVertexes)
22
        {
23
            if(lowcost[j] != 0 && lowcost[j] < min)
24
            {
25
                min = lowcost[j];
26
                k = j;
27
            }
28
            j++;
29
        }
30

31
        printf("(%d,%d)",adjvex[k],k);
32
        lowcost[k] = 0;
33
        for(j = i;j < G.numVertexes;j++)
34
        {
35
            if(lowcost[j]!=0 && G.arc[k][j] < lowcost[j])
36
            {
37
                lowcost[j] = G.arc[k][j];
38
                adjvex[j] = k;
39
            }
40
        }
41
    }
42
}

2.克鲁斯卡尔(Kruskal)算法
//Kruskal算法生成最小生成树
void MiniSpanTree_Kruskal(MGraph G)
{
int i,n,m;
Edge edges[MAXEDGE];
int parentp[MAXVEX]; //省略将邻接矩阵转化为边集数组edges并按权由小到大排序的代码
for(i = 0; i < G.numEdges;i++)
{
parent[i] = 0;
}
for(i = o;i < G.numEdges;i++)
{
n = Find(parent,edges[i].begin);
m = Find(parent,edges[i].end);
if(n != m)
{
parent[n] = m;
printf("(%d,%d) %d ",edges[i].begin,edges[i].end,edges[i].weight); }
}
} int Find(int *parent,int f)
{
while(parent[f] > 0)
{
f = parent[f];
}
return f;
}
34
 
1
//Kruskal算法生成最小生成树
2
void MiniSpanTree_Kruskal(MGraph G)
3
{
4
    int i,n,m;
5
    Edge edges[MAXEDGE];
6
    int parentp[MAXVEX];
7

8
    //省略将邻接矩阵转化为边集数组edges并按权由小到大排序的代码
9
    for(i = 0; i < G.numEdges;i++)
10
    {
11
        parent[i] = 0;
12
    }
13
    for(i = o;i < G.numEdges;i++)
14
    {
15
        n = Find(parent,edges[i].begin);
16
        m = Find(parent,edges[i].end);
17
        if(n != m)
18
        {
19
            parent[n] = m;
20
            printf("(%d,%d) %d ",edges[i].begin,edges[i].end,edges[i].weight);
21

22
        }
23
    }
24
}
25

26

27
int Find(int *parent,int f)
28
{
29
    while(parent[f] > 0)
30
    {
31
        f = parent[f];
32
    }
33
    return f;
34
}


3.迪杰斯特拉(Dijkstra)算法
//迪杰斯特拉(Dijkstra)算法
#define MAXVEX 9
#define INFINITY 65535 typedef int Patharc[MAXVEX];
typedef int ShortPathTable[MAXVEX]; void ShortestPath_Dijkstra(MGraph G,INT V0,Patharc *P,ShortPathTable *D)
{
int v,w,k,min;
int final[MAXVEX];
for(v = 0;v < G.numVertexes;v++)
{
final[v] = 0;
(*D)[v] = G.arc[v0][v];
(*P)[v] = 0;
}
(*D)[v0] = 0;
final[vo] = 1; for(v = 1;v < G.numVertexes;w++)
{
min = INFINITY;
for(w = 0;w < G.numVertexes;w++)
{
if(!final[w] && (*D)[w] < min)
{
k = w;
min = (*D)[w];
}
} final[k] = 1;
for(w = 0;w < G.numVertexes;w++)
{
if(!final[w] && (min+G.arc[k][w])< (*D)[w])
{
(*D)[w] = min + G.arc[k][w];
(*P)[w] = k;
}
}
}
}
44
 
1
//迪杰斯特拉(Dijkstra)算法
2
#define MAXVEX 9
3
#define INFINITY 65535
4

5
typedef int Patharc[MAXVEX];
6
typedef int ShortPathTable[MAXVEX];
7

8

9
void ShortestPath_Dijkstra(MGraph G,INT V0,Patharc *P,ShortPathTable *D)
10
{
11
    int v,w,k,min;
12
    int final[MAXVEX];
13
    for(v = 0;v < G.numVertexes;v++)
14
    {
15
        final[v] = 0;
16
        (*D)[v] = G.arc[v0][v];
17
        (*P)[v] = 0;
18
    }
19
    (*D)[v0] = 0;
20
    final[vo] = 1;
21

22
    for(v = 1;v < G.numVertexes;w++)
23
    {
24
        min = INFINITY;
25
        for(w = 0;w < G.numVertexes;w++)
26
        {
27
            if(!final[w] && (*D)[w] < min)
28
            {
29
                k = w;
30
                min = (*D)[w];
31
            }
32
        }
33

34
        final[k] = 1;
35
        for(w = 0;w < G.numVertexes;w++)
36
        {
37
            if(!final[w] && (min+G.arc[k][w])< (*D)[w])
38
            {
39
                (*D)[w] = min + G.arc[k][w];
40
                (*P)[w] = k;
41
            }
42
        }
43
    }
44
}

4.弗洛伊德(Floyd算法)
//弗洛伊德(Floyd算法)
typedef int PathMatirx[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX]; void ShortestPath_Floyd(MGraph G,Pathmatirx *P,ShortPathTable *D)
{
int v,w,k;
for(v = 0;v < G.numVertexes; ++v)
{
for(w = 0;w < G.numVertexes;++w)
{
(*D)[v][w] = G.matirx[v][w];
(*P)[v][w] = w;
}
} for(k = 0;k < G.numVertexes;++k)
{
for(v = 0;v < G.numVertexes;++v)
{
for(w = 0;w < G.numVertexes;++w)
{
if((*D)[v][w] > (*D)[v][k]+(*D)[k][w])
{
(*D)[v][w] = (*D)[v][w]+(*D)[k][w];
(*P)[v][w] = (*P)[v][k];
}
}
}
}
} //最短路径显示代码段
for(v = 0;v < Q.numVertexes;++v)
{
for(w = v+1;w < G.numVertexes;w++)
{
printf("v%d-v%d weight: %d ",v,w,D[v][w]);
k = P[v][w];
printf(" path: %d",v); while(k != w)
{
printf(" -> %d",k);
k = P[k][w];
}
printf(" -> %d\n",w);
}
printf("\n");
}
x
 
1
//弗洛伊德(Floyd算法)
2
typedef int PathMatirx[MAXVEX][MAXVEX];
3
typedef int ShortPathTable[MAXVEX][MAXVEX];
4

5
void ShortestPath_Floyd(MGraph G,Pathmatirx *P,ShortPathTable *D)
6
{
7
    int v,w,k;
8
    for(v = 0;v < G.numVertexes; ++v)
9
    {
10
        for(w = 0;w < G.numVertexes;++w)
11
        {
12
            (*D)[v][w] = G.matirx[v][w];
13
            (*P)[v][w] = w;
14
        }
15
    }
16

17
    for(k = 0;k < G.numVertexes;++k)
18
    {
19
        for(v = 0;v < G.numVertexes;++v)
20
        {
21
            for(w = 0;w < G.numVertexes;++w)
22
            {
23
                if((*D)[v][w] > (*D)[v][k]+(*D)[k][w])
24
                {
25
                    (*D)[v][w] = (*D)[v][w]+(*D)[k][w];
26
                    (*P)[v][w] = (*P)[v][k];
27
                }
28
            }
29
        }
30
    }
31
}
32

33

34

35
//最短路径显示代码段
36
for(v = 0;v < Q.numVertexes;++v)
37
{
38
    for(w = v+1;w < G.numVertexes;w++)
39
    {
40
        printf("v%d-v%d weight: %d ",v,w,D[v][w]);
41
        k = P[v][w];
42
        printf(" path: %d",v);
43

44
        while(k != w)
45
        {
46
            printf(" -> %d",k);
47
            k = P[k][w];
48
        }
49
        printf(" -> %d\n",w);
50
    }
51
    printf("\n");
52
}

附件列表

Chapter 7(图)的更多相关文章

  1. Chapter 4 图

    Chapter 4 图 . 1-   图的存储结构 无向图:对称 有向图:…… 2-   图的遍历 1   深度优先搜索(DFS) 类似于二叉树的先序遍历 2   广度优先搜索(BFS) 类似于二叉树 ...

  2. 【译】x86程序员手册13-第5章 内存管理

    Chapter 5 Memory Management 内存管理 The 80386 transforms logical addresses (i.e., addresses as viewed b ...

  3. 《算法导论》习题解答 Chapter 22.1-5(求平方图)

    一.邻接矩阵实现 思路:如果是邻接矩阵存储,设邻接矩阵为A,则A*A即为平方图,只需要矩阵相乘即可: 伪代码: for i=1 to n for j=1 to n for k=1 to n resul ...

  4. 《算法导论》习题解答 Chapter 22.1-3(转置图)

    一.邻接表实现 思路:一边遍历,一边倒置边,并添加到新的图中 邻接表实现伪代码: for each u 属于 Vertex for v 属于 Adj[u] Adj1[v].insert(u); 复杂度 ...

  5. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger

    Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...

  6. [转]第四章 使用OpenCV探测来至运动的结构——Chapter 4:Exploring Structure from Motion Using OpenCV

    仅供参考,还未运行程序,理解部分有误,请参考英文原版. 绿色部分非文章内容,是个人理解. 转载请注明:http://blog.csdn.net/raby_gyl/article/details/174 ...

  7. PRML Chapter 2. Probability Distributions

    PRML Chapter 2. Probability Distributions P68 conjugate priors In Bayesian probability theory, if th ...

  8. WITCH CHAPTER 0 [cry] 绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌

    西川善司的[WITCH CHAPTER 0  cry]讲座 ~绝密开发中的史克威尔艾尼克斯的DX12技术演示全貌   注:日文原文地址: http://pc.watch.impress.co.jp/d ...

  9. Chapter 3: Connector(连接器)

    一.概述 Tomcat或者称之为Catalina(开发名称),可以简化为两个主要的模块,如下图: 多个Connector关联一个Container.之所以需要多个Connector,是为了处理多种协议 ...

随机推荐

  1. CentOS6安装与运行R脚本

    http://blog.csdn.net/bdchome/article/details/47811763

  2. DataGridView 复选框 操作大全

    DataGridViewCheckBoxColumn dtCheck = new DataGridViewCheckBoxColumn(); dtCheck.DataPropertyName = &q ...

  3. 团队项目-北航MOOC系统Android客户端 NABC

    北航MOOC系统Android客户端 NABC (N) Need 需求 MOOC的全名是Massive Open Online Course,被称作大型开放式网络课程.2012年,美国的顶尖大学陆续设 ...

  4. 面向对象OO第5-7次作业总结

    面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...

  5. 第二阶段Sprint冲刺会议9

    进展:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码,没有成功.

  6. 数据库,总结,新技能get

    上来先粘代码吧,这篇本来就不是用来让你们看的,我就是单纯的记录下,嗯~对,总结!!! 首先:first //绑定年份 YearSearch.Items.Clear(); for (int i = Da ...

  7. 读书笔记之java编程思想2

    今天将第一章余下的部分读完了,余下部分讲解了java单继承的特点,单继承保证了所有的子类都有一个基类,这使得java所实现的垃圾回收器的实现变得简单了很多,单继承保证了所有的对象都具有一些功能,使得参 ...

  8. 调研Android的开发环境的发展演变

    在 知道要做基于移动端的项目实践时,我就选定了Android,回来的时候查了很多相关的知识,很多人都在问开发安卓软件,使用eclipse还是用 Android studio?其实,也没有一个准确的答案 ...

  9. 深入理解Java类加载器(2)

    1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  10. grunt入门讲解2:如何使用 Gruntfile 配置任务

    Grunt的task配置都是在 Gruntfile 中的grunt.initConfig方法中指定的.此配置主要包括以任务名称命名的属性,和其他任意数据.一旦这些代表任意数据的属性与任务所需要的属性相 ...