zoukankan      html  css  js  c++  java
  • [HDU

    最小生成树。

    题意就是有N座城市,每个城市有一定的幸福值a[i]。对于任意两个城市i和j,如果a[i],a[j],a[i]+a[j]中任意一者的值为素数,那么他们的边权就是min(min(a[i],a[j]),abs(a[i]-a[j]))。问题就是这一幅图的最小生成树。
    显然,边一旦建出来了,这就是一道裸题。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    typedef pair<int, int> pii;
    const int N = 600 + 10, maxn = 2000000 + 10, inf = 0x3f3f3f3f;
    
    int graph[N][N];
    int mincost[N];
    int vis[N];
    int prime[maxn];
    
    int prim(int n)
    {
        memset(mincost, 0x3f, sizeof mincost);
        memset(vis, 0, sizeof vis);
        mincost[1] = 0;
        int ans = 0, num = 0;
        while(true)
        {
            int v = -1;
            for(int i = 1; i <= n; i++)
                if(! vis[i] && (v == -1 || mincost[i] < mincost[v])) v = i;
            if(v == -1 || mincost[v] == inf) 
                break;
            vis[v] = true;
            ans += mincost[v];
            num++;
            for(int i = 1; i <= n; i++) 
                mincost[i] = min(mincost[i], graph[v][i]);
        }
        return num == n ? ans : -1;
    }
    void filter()
    {
        prime[0] = prime[1] = 1;
        for(int i = 2; i * i < maxn; i++)
            if(! prime[i])
                for(int j = i + i; j < maxn; j += i) 
                    prime[j] = 1;
    }
    int main()
    {
        filter();
        int t, n, a[N];
        scanf("%d", &t);
        while(t--)
        {
            memset(graph, 0x3f3f3f, sizeof(graph));
            scanf("%d", &n);
            for(int i = 1; i <= n; i++) 
                scanf("%d", &a[i]);
            for(int i = 1; i <= n; i++)
                for(int j = i + 1; j <= n; j++)
                {
                    if(! prime[a[i]] || ! prime[a[j]] || ! prime[a[i]+a[j]])
                    {
                        int cost = min(min(a[i], a[j]), abs(a[i] - a[j]));
                        graph[i][j] = graph[j][i] = cost;
                    }
                }
            printf("%d
    ", prim(n));
        }
        return 0;
    }
  • 相关阅读:
    关于 token
    windows 使用 virtualbox,搭建 minikube 环境
    kafka 和 rocketMQ 的数据存储
    分享周鸿祎的《如何建立一个“铁打的营盘”》
    How to configue session timeout in Hive
    毕业十年纪念
    常用排序算法
    [异常处理]class kafka.common.UnknownTopicOrPartitionException (kafka.server.ReplicaFetcherThread)
    线程的几个状态
    星型模式
  • 原文地址:https://www.cnblogs.com/Vikyanite/p/11385567.html
Copyright © 2011-2022 走看看