整数数组中最大子数组求和03 学习计划06

 

  第六周
所花时间(包括上课)

20H

代码量(行) 1000
博客量(篇) 4
了解到的知识

1。了解图形用户开发的各种组件

2。复习了数据结构图论部分

从文件中读取数组,通过将数组转化为无相连通图,再经过遍历找出子联通数组,求和

 合作者:杨安琪http://www.cnblogs.com/ning-JML/p/5360800.html

代码:

#include<iostream>
#include<fstream>
#include<ctime>
using namespace std;
#define N 100

typedef struct
{
    int dian[N];
    int xian[N][N];
    int dianx, xianx;
}A;

void set(A &shu, int x, int y, ifstream &infile)
{
    shu.dianx = x*y;
    srand((unsigned)time(NULL));
    for (int i = 1; i <= shu.dianx; i++)
    {
    
        infile >> shu.dian[i];
    }
    infile.close();
    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 numdian(A &Shu, int &hangshu, int &lieshu)
{
    ifstream infile("input.txt", ios::in);
    if (infile.is_open() == false)
    {
        cerr << "open error!" << endl;
        exit(1);
    }
    infile >> hangshu >> lieshu;
    set(Shu, hangshu, lieshu, infile);
}
void output(A shu)
{
    for (int i = 1; i <= shu.dianx; i++)
    {
        cout << shu.dian[i];
        if (shu.xian[i][i + 1] == 1)
            cout << "  ";
        else
            cout << endl;
    }
}
void bianli(A &shu, int v, int visit[], int &b, int &max, 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(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()
{
    
    int hangshu, lieshu;
    A shu;
    numdian(shu, hangshu, lieshu);
    
    output(shu);

    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
        {
            int visit[N] = { 0 };
            int max = 0;
            bianli(shu, i, visit, b[i], max, hangshu);
        }
    }

    int max = b[1];
    for (int i = 2; i <= shu.dianx; i++)
    {
        if (b[i]>max)
            max = b[i];
    }
    cout << "最大联通子数组的和为:" << max << endl;
}
View Code

试验截图:

txt文件内容如下:

posted @ 2016-04-06 19:12  里拉里拉  阅读(167)  评论(1编辑  收藏  举报