• POJ2485 Highways(最小生成树)


    题目链接

    分析:

    POJ2253要简单些。

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    
    using namespace std;
    
    const int maxn = 550;
    const int INF = (1<<30);
    
    int G[maxn][maxn], d[maxn], n;
    
    int prim() {
        bool vis[maxn];
        memset(vis, false, sizeof(vis));
    
        for(int i=0; i<n; i++) {
            d[i] = G[0][i];
        }
    
        d[0] = 0;
        vis[0] = true;
    
        for(int i=0; i<n-1; i++) {
            int m = INF, x;
            for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
            vis[x] = true;
            for(int y=0; y<n; y++)
                if(!vis[y]) {
                    int maxx = max(d[x], G[x][y]);
                    d[y] = min(d[y], maxx);
                }
        }
    
        int ans = 0;
        for(int i=0; i<n; i++) {
            ans = max(ans, d[i]);
        }
    
        return ans;
    }
    
    int main() {
        int T;
    
        scanf("%d", &T);
    
        while(T--) {
            scanf("%d", &n);
    
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    scanf("%d", &G[i][j]);
                }
            }
    
            printf("%d
    ", prim());
        }
    
        return 0;
    }
    View Code

    看到有人用其它方法过了,就是prim加了个判断,按着那人思路,再写了一遍。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    
    using namespace std;
    
    const int maxn = 550;
    const int INF = (1<<30);
    
    int G[maxn][maxn], d[maxn], n;
    
    int prim() {
        bool vis[maxn];
        memset(vis, false, sizeof(vis));
    
        int maxx = 0;
    
        for(int i=0; i<n; i++) {
            d[i] = G[0][i];
        }
    
        d[0] = 0;
        vis[0] = true;
    
        for(int i=0; i<n-1; i++) {
            int m = INF, x;
            for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m = d[x=y];
            vis[x] = true;
            if(maxx < m) maxx = m;
            for(int y=0; y<n; y++) if(!vis[y] && d[y] > G[x][y]) d[y] = G[x][y];
        }
    
        return maxx;
    }
    
    int main() {
        int T;
    
        scanf("%d", &T);
    
        while(T--) {
            scanf("%d", &n);
    
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    scanf("%d", &G[i][j]);
                }
            }
    
            printf("%d
    ", prim());
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Access 通用访问类 OleDbHelper
    让Visual Studio 也支持JS代码折叠 [ Visual Studio | #region | #endregion ]
    提高网站性能的方法
    php 正则表达式整理 归纳 重点
    C++数据结构知识点
    algorithm算法设计,数据结构基本概念之我的归纳 by whb_咸菜圣斗士啊斌斌斌斌
    浏览器兼容性问题及常见的解决方法
    js抽象方法的使用
    js制作图片轮换切换
    C语言排序算法总结
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3170590.html
Copyright © 2020-2023  润新知