码迷,mamicode.com
首页 > 移动开发 > 详细

最大子数组之联通版

时间:2016-04-04 22:29:48      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

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

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

团队成员:王硕   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 << "\r\n";
    }
    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改为\r\n即可。

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

最大子数组之联通版

标签:

原文地址:http://www.cnblogs.com/liyan-luckygirl/p/5352899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!