Prim算法求最小生成树

来源:互联网 发布:免费建站 知乎 编辑:程序博客网 时间:2024/06/10 16:28

Code:

Prim算法求最小生成树#include<bits/stdc++.h>using namespace std;const int maxn = 1000;int m, n;int cost[maxn][maxn];int dis[maxn];int visited[maxn];int prim(){/*算法流程:1.从任意一个顶点开始构造生成树,假设从1号顶点开始。首先将顶点1加入到生成树中,用visited数组来标记哪些顶点加入了生成树中。2.用dis数组来记录生成树到各个顶点的距离,最初生成树中只有1号顶点,dis数组里面存储的就是所有顶点到1号顶点的距离,没有边的的话就是无穷大(初始化数组)3.从dis数组中选出离生成树最近的顶点,加入到生成树中,然后在以新加入的这个点为中间点,更新其他顶点到这个生成树的距离4.重复过程3,直到有生成树里面有n个顶点*/    //初始化    memset(visited, 0, sizeof(visited));    for(int i = 1; i <= n; i++)        dis[i] = cost[1][i];    dis[1] = 0;    visited[1] = true; //!!!!    //开始n-1次,好像一棵生成树在慢慢长大!!    int N = n-1;    int Cost = 0;    while(N--)    {        int Dis = 0x3f3f3f3f;        int pos;        for(int i = 1; i <= n; i++) //z找到离生成树最近的那个点        {            if(Dis > dis[i] && !visited[i])            {                Dis = dis[i]; pos = i;            }        }        if(Dis == 0x3f3f3f3f)            return -1;        Cost += Dis;        visited[pos] = true;        //松弛        for(int i = 1; i <= n; i++)        {            if(!visited[i])                dis[i] = min(cost[pos][i], dis[i]);        }    }    return Cost;}int main(){    memset(cost, 0x3f, sizeof(cost));    scanf("%d %d", &n, &m); //点数, 边数    for(int i = 0; i < m; i++)    {        int v1, v2, val;        scanf("%d %d %d", &v1, &v2, &val);        cost[v1][v2] = cost[v2][v1] = val;    }    int ans = prim();    cout << ans << endl;    return 0;}//Dijkstra 求最短路#include<bits/stdc++.h>using namespace std;int main(){    int x;    while(cin >> x)    {        int m = x << 1 ;        int n = (x << 1) | 1;        cout << m << " " << n << endl;    }    return 0;}