道路建设(prim算法)

道路建设

https://ac.nowcoder.com/acm/problem/15108

在上一篇文章中我们用 kruskal算法 解决了这个问题 在这篇题解中 我们将用 prim算法来解决这一问题
首先我们写贴上从毛毛雨学姐那 贴来的 模板代码
图片说明
再贴上本题的AC代码:

#include<iostream>
#include<algorithm>
#include<set>
#include<string>
#include<cstring>
#include<queue>
using namespace std;
#define close_stdin  ios::sync_with_stdio(false)
#define pr pair<int,int>
const int maxn = 1e4 + 7;
typedef long long ll;
int head[105], to[maxn << 1], nex[maxn << 1], edge[maxn << 1], tot;
int C, n, m;
void add(int x, int y, int z) {
    to[tot] = y;
    edge[tot] = z;
    nex[tot] = head[x];
    head[x] = tot++;
}
bool vis[maxn];
int prim() {
    priority_queue<pr, vector<pr>, greater<pr> > que;
    memset(vis, 0, sizeof(vis));
    for (int i = head[1]; i!=-1; i = nex[i])
        que.push(make_pair(edge[i], to[i]));
    vis[1] = true;
    int ans = 0;
    while (!que.empty() ) {
        int u = que.top().second, w = que.top().first;
        que.pop();
        if (vis[u]) continue;
        ans += w;
        vis[u] = true;
        for (int i = head[u]; i!=-1; i = nex[i]) {
            int v = to[i];
            if (vis[v]) continue;
            que.push(make_pair(edge[i], v));
        }
    }
    return ans;
}
int main()
{
    while (scanf("%d%d%d", &C, &m, &n) != EOF) {
        memset(head, -1, sizeof(head));
        tot = 0;
        for (int i = 1, u, v, w; i <= m; i++) {
            scanf("%d%d%d", &u, &v, &w);
            add(u, v, w); add(v, u, w);
        }
        int cost = prim();
        if ((cost > C)) printf("No\n");
        else printf("Yes\n");
    }
}

谢谢浏览

全部评论

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务