最小生成树和最短路径

来源:互联网 发布:js 滚动条居中 编辑:程序博客网 时间:2024/05/11 23:19
带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法;有向图的最短路径算法有dijkstra算法和floyd算法。

int prime(int s)//s为起点 {    int index;    int sum = 0;    memset(vis, false, sizeof(vis));    vis[s] = true;    for(int i=1;i<=m; i++)//以s为起点,将该点连接的所有边权给dist数组         dist[i] = graph[s][i];    for(int i = 1; i < m; i ++)//操作m-1次将剩余的点加入 {        int mincost = INF;        for(int j=1;j<=m;j++)//找出最小的边 {            if(!vis[j]&&dist[j]<mincost){                mincost = dist[j];                index = j;            }        }        vis[index] = true;//访问该边的端点         sum += mincost;//累加权值         for(int j=1;j<=m;j++){            if(!vis[j] && dist[j] > graph[index][j])//更新所有能连的最小权值                 dist[j] = graph[index][j];        }    }    return sum;}
void dijkstra(int s)//s是起点{int index;     memset(vis,false,sizeof(vis));    vis[s] = true;    for(int i=1;i<=n;i++)//从s到其他所有点的最短路         dist[i] = graph[s][i];    for(int i=1;i<n;i++){        int mincost = INF;        for(int j=1;j<=n;j++){            if(!visit[j] && dist[j] < mincost){                mincost = dist[j];                index = j;                }            }        visit[index]=true;        sum+=mincost;        for(int j=1;j<=n;j++){            if(!visit[j] && dist[j] > dist[index] + graph[index][j])//当加入一个点时,该点与s点可能有共同的顶点,所以需要更新                 dist[j] = dist[index] + graph[index][j];        }    }}
void floyd(){    for(int k =1;k<=n;k++)//作为循环中间点的k必须放在最外一层循环  for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                if(dist[i][j] > dist[i][k] + dist[k][j])                    dist[i][j] = dist[i][k] + dist[k][j];//dist[i][j]得出的是i到j的最短路径            }}
int kruskal(int n) //n为边的数量 {    int sum=0;    make_set();//并查集初始化     for(int i=0; i <n;i++)//先排序,从权最小的边开始加进图中 {        if(find_set(edge[i].start)!= find_set(edge[i].end))//若最终父亲不同,则合并两棵树直到变成一颗 {            Union(edge[i].start, edge[i].end);            sum+=edge[i].val;        }    }    return sum;}

0 0