zoukankan      html  css  js  c++  java
  • 最小生成树-prim

    算法模型: 随机顶点  ,顶点存入S集, 剩余顶点存入T集合

    每次遍历顶点。 取一条可以连接S与T最短边e,  直到所有顶点所有增加S


    #include<cstdio>

    #include<cstring>
    #define INF 1<<30 
    int n,m,vis[110],low[110];
    int map[110][110];


    int init()
    {
        for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
        map[i][j] = INF;
        memset(vis,0,sizeof(vis));
    }
    int prim()
    {
        int ans=0;
        for(int i = 0; i <= n; i++)
        low[i] = map[1][i];  //每一个顶点与s集的最短距离。默认从1点開始
        vis[1] = 1;
        for(int i = 1; i < n; i++)
        {
            int temp = INF,pos=-1;
            for(int j = 1; j <= n; j++)
            if(temp>low[j]&&!vis[j]) //寻找最小边
            {
                pos = j;
                temp = low[j];
            }
            if(pos==-1) return -1; // 代表这当前步骤缺少条件
            int k = pos;
            vis[k] = 1;
            ans+=low[k];
            for(int j = 1; j <= n; j++)
            if(!vis[j]&&low[j]>map[k][j])//更新最小边
            low[j] = map[k][j];
        }
        return ans;
    }
    int main()
    {
        int a,b,c;
        while(scanf("%d%d",&m,&n)==2)
        {
            if(!m) break;
            init();
            for(int i = 0; i < m; i++)
            {
                scanf("%d %d %d",&a,&b,&c);
                map[a][b] = map[b][a] = c;
            }
            int p = prim();
            if(p==-1)
            puts("?

    ");
            else
            printf("%d ",p);
        }
        return 0;
    }

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    字符数组+数组复习
    C语言博客作业05-指针
    C语言博客作业04 数组
    C语言博客作业03 函数
    Java与C# socket通信
    JDBC复制数据库(sqlite)
    mysql Connector/net不能更新或删除(转载)
    MATLAB回归、插值、逼近、拟合【转载】
    前端请求RestController发送数据方法汇总
    elementUI el-input 输入框 设置高度和宽度
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4679199.html
Copyright © 2011-2022 走看看