• PAT 7-14 公路村村通


    https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

    输入格式:

    输入数据包括城镇数目正整数N(≤)和候选道路数目M(≤);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

    输出格式:

    输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−,表示需要建设更多公路。

    输入样例:

    6 15
    1 2 5
    1 3 3
    1 4 7
    1 5 4
    1 6 2
    2 3 4
    2 4 6
    2 5 2
    2 6 6
    3 4 6
    3 5 1
    3 6 1
    4 5 10
    4 6 8
    5 6 3
    

    输出样例:

    12

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int inf = 0x3f3f3f3f;
    int N, M;
    int mp[3010][3010];
    int vis[3010];
    vector<int> v[3010];
    int dis[3010];
    
    void dfs(int st) {
        if(v[st].size() == 0) return;
        for(int i = 0; i < v[st].size(); i ++) {
            if(!vis[v[st][i]]) {
                vis[v[st][i]] = 1;
                dfs(v[st][i]);
            }
        }
    }
    
    void prime() {
        memset(dis, inf, sizeof(dis));
        memset(vis, 0, sizeof(vis));
    
        for(int i = 1; i <= N; i ++)
            dis[i] = mp[1][i];
        dis[1] = 0;
        long long res = 0;
        int temp;
    
        for(int i = 1; i <= N; i ++) {
            int minn = inf;
            for(int j = 1; j <= N; j ++) {
                if(!vis[j] && dis[j] < minn) {
                    minn = dis[j];
                    temp = j;
                }
            }
            vis[temp] = 1;
            for(int k = 1; k <= N; k ++) {
                if(!vis[k]) {
                    dis[k] = min(dis[k], mp[temp][k]);
                }
            }
        }
    
        for(int i = 1; i <= N; i ++)
            res += dis[i];
    
        printf("%lld
    ", res);
    }
    
    int main() {
        memset(mp, inf, sizeof(mp));
        scanf("%d%d", &N, &M);
        for(int i = 0; i < M; i ++) {
            int st, en, cos;
            scanf("%d%d%d", &st, &en, &cos);
            v[st].push_back(en);
            v[en].push_back(st);
            mp[st][en] = mp[en][st] = cos;
        }
    
        memset(vis, 0, sizeof(vis));
        int cnt = 0;
        for(int i = 1; i <= N; i ++) {
            if(vis[i]) continue;
            cnt ++;
            dfs(i);
        }
    
        if(cnt > 1) printf("-1
    ");
        else prime();
    
        return 0;
    }
    

      dfs + prim mp 忘记初始化 wa 了四发 自己的 bug 自己改!

    今天蓝桥出成绩 虽然是意料之内的省二但是还是有点失望 唉 周末的天梯拜托了啊 一定要加油啊!!!

  • 相关阅读:
    .NET常见问题收集
    .NET 常用转换
    Android 百度地图开发setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
    Android_参考
    常用操作
    Android开发笔记——Eclipse 关联Android源码
    Android开发笔记静态变量问题
    无法载入 mysql 扩展,<br />请检查 PHP 配置 解决办法
    服务器维护
    cocos2d 左下角三行
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10618193.html
Copyright © 2020-2023  润新知