zoukankan      html  css  js  c++  java
  • 杭电2682--Tree(Prim)

    我也是醉了, 无限WA 。

    注意一下使用邻接矩阵时循环语句的不同处。 

    1 for(int i = 1; i <= n; i++)  for(int j  = i; j  <= n; j++)  map[i][j]=map[j][i]=(i==j?0:INF)  
    2 
    3 和普通写法区别。
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define M 601 
    #define N 1000001
    using namespace std;
    const int INF = 0x3f3f3f3f;
    int sieve[N*2], dis[M], vis[M], Rode[M], map[M][M];
    int n;
    int Min(int a, int b)
    {
        if(a < b)
            return a;
        else
            return b;
    }
    void Is_Prime()
    {
        memset(sieve, 0, sizeof(sieve));
        sieve[0] = sieve[1] = 1;
        for(int i = 2; i < N*2; i++)
        {
            if(!sieve[i])
                for(int j = 2*i; j < N*2; j += i)
                    sieve[j] = 1;
        }
    }
    void Prime()
    {
        int sum = 0;
        memset(vis, 0, sizeof(vis));
        for(int i = 1; i <= n; i++)
            dis[i] = map[1][i];
        vis[1] = 1;
        for(int i = 1; i < n; i++)
        {
            int temp = 1, min = INF;
            for(int j = 1; j <= n; j++)
            {
                if(!vis[j] && dis[j] < min)
                {
                    temp = j;
                    min = dis[j];    
                }    
            } 
            if(min == INF)
            {
                printf("-1
    ");
                return;
            }
            vis[temp] = 1;
            sum += min;
            for(int j = 1; j <= n; j++)
                if(!vis[j] && dis[j] > map[temp][j])
                    dis[j] = map[temp][j];
        }
        printf("%d
    ", sum);
    }
    int main()
    {
        int T;
        scanf("%d", &T);
        Is_Prime();
        while(T--)
        {
            scanf("%d", &n);
            for(int i = 1; i <= n; i++)
                scanf("%d", &Rode[i]);
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= n; j++)
                    map[i][j] = (i==j?0:INF);
            for(int i = 1; i <= n; i++)
                for(int j = 1; j <= i; j++)
                    if(!sieve[Rode[i]] || !sieve[Rode[j]] || !sieve[Rode[i] + Rode[j]])
                        map[i][j] = map[j][i] = Min(Min(Rode[i], Rode[j]), abs(Rode[i]-Rode[j]));
            Prime();
        }
        return 0;    
    }
  • 相关阅读:
    动态规划----查找一个数组中存在的数学数列
    java数据结构和算法------第八章
    java数据结构和算法-----第七章
    04002_HTML表单
    雷林鹏分享:PHP 高级过滤器
    雷林鹏分享:Lua 函数
    雷林鹏分享:Lua 流程控制
    雷林鹏分享:Lua 循环
    雷林鹏分享:Lua 变量
    雷林鹏分享:Lua 数据类型
  • 原文地址:https://www.cnblogs.com/soTired/p/4816588.html
Copyright © 2011-2022 走看看