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# Server.Transfer传值方式
    asp.net验证码生成
    pop协议指令
    Url Rewriting后的问题
    c# 一个通过oledb读取excel,csv的类
    jquery选择器全解
    覆盖与重载(override/overload) [C#]
    ASP.NET内置对象
    web开发敏捷之道应用rails进行敏捷web开发【读书笔记2】
    win7自动壁纸切换小工具AutoDesk一:初始化托盘
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4679199.html
Copyright © 2011-2022 走看看