• 最大子数组之联通版


    本程序的基本功能是:输入数组的行数和列数,程序自动生成对应规格的数组,在满足连通性的情况下,求最大的子数组的和。

    主要的功能的实现是依靠图的遍历。

    团队成员:王硕   http://home.cnblogs.com/u/WS1004/
    #include<fstream> 
    #include<iostream>
    #include<ctime>
    using namespace std;
    #define RAND16 ((rand()<<1) + (rand()&1))
    #define N 100
    # define WIDE 4294967296
    typedef struct
    {
        long long int dian[N];
        long long int xian[N][N];
        long long int dianx, xianx;
    }A;
    
    void set(A &shu, int x, int y)
    {
        shu.dianx = x*y;
        srand((_int32)time(NULL));
        for (int i = 1; i <= shu.dianx; i++)
        {
            shu.dian[i] = (RAND16 << 16) + RAND16;
            if (rand() % 2 == 1)
                shu.dian[i] = shu.dian[i] * (-1);
        }
        for (int i = 1; i <= shu.dianx; i += y)
        {
            for (int j = i; j <= i + y - 2; j++)
            {
                shu.xian[j][j + 1] = 1;
                shu.xian[j + 1][j] = 1;
            }
        }
        for (int i = 1 + y; i<shu.dianx; i += y)
        {
            for (int j = i; j <= i + x - 1; j++)
            {
                shu.xian[j][j - y] = 1;
                shu.xian[j - y][j] = 1;
            }
        }
    }
    
    void bianli(A &shu, long long int v, long long int visit[], long long int &b, long long int &max, long long int x)
    {
        visit[v] = 1;
    
        max += shu.dian[v];
        if (max >= b)
            b = max;
    
        int a = 0, bo = 0;
        for (int w = 1; w <= shu.dianx; w++)
        {
            for (int c = 1; c <= shu.dianx; c++)
            {
                if ((visit[w] == 0) && (shu.xian[c][w] == 1) && (visit[c] == 1))
                {
                    a = w; bo = 1; break;
                }
            }
            if (bo == 1)
                break;
        }
        for (int w = 1; w <= shu.dianx; w++)
        {
            for (int c = 1; c <= shu.dianx; c++)
            {
                if ((visit[w] == 0) && (shu.xian[c][w] == 1) && (visit[c] == 1))
                {
                    if (shu.dian[a]<shu.dian[w])
                        a = w;
                }
            }
        }
        if (b + shu.dian[a]<0)
        {
            shu.xian[v][a] = 0;
        }
        else
            bianli(shu, a, visit, b, max, x);
    }
    
    int NoVisit(long long int visit[], A shu)
    {
        int k = 0, i;
        for (i = 1; i <= shu.dianx; i++)
        {
            if (visit[i] == 0)
            {
                k = i;
                break;
            }
        }
        return k;
    }
    
    int main()
    {
        cout << "请输入数组行列数:" << endl;
        int x, y;
        cin >> x >> y;
        A shu;
        set(shu, x, y);
        ofstream fout("D:\input.txt",ios::binary);
        for (int i = 1; i <= shu.dianx; i++)
        {
            fout << shu.dian[i] ;
            if (shu.xian[i][i + 1] == 1)
                fout << "   ";
            else
                fout << "
    ";
        }
        long long int v = 1, b[N] = { 0 }, h = 0;
        for (int i = 1; i <= shu.dianx; i++)
        {
            if (shu.dian[i]<0)
            {
                b[i] = shu.dian[i];
            }
            else
            {
                long long int visit[N] = { 0 };
                long long int max = 0;
                bianli(shu, i, visit, b[i], max, x);
            }
        }
    
        long long int max = b[1];
        for (int i = 2; i <= shu.dianx; i++)
        {
            if (b[i]>max)
                max = b[i];
        }
        fout << "最大联通子数组的和为:" << max << endl;
    }

    总结:

    本次编程中出现了一些问题,在文件中输出不能换行,后上网得知把endl改为 即可。

    此次编程有上两次编程的基础,化难为易的思想发挥了非常大的作用。

  • 相关阅读:
    mybatis学习成长之路(一)
    badboy页面脚本发生错误,解决方案
    资料下载地址大全
    excel2003和excel2007文件的创建和读取
    文件的上传下载
    读取.properties的内容1
    Java的垃圾回收机制
    Bell数和Stirling数
    Catalan数计算及应用
    [算法]循环赛日程表
  • 原文地址:https://www.cnblogs.com/liyan-luckygirl/p/5352899.html
Copyright © 2020-2023  润新知