zoukankan      html  css  js  c++  java
  • 最大连通数组

    队友:http://home.cnblogs.com/u/SurverDevin/

    一、设计思路 

    1、实现文本的读取,因为文本的前两行提供的是数组的行和列,所以文本读取时会进行前两行的读取,再读取数组。

    2、在实现连通数组时,将数组转化为图。首先将二维数组转化为一维数组,这个一维数组存的其实是图的权值。然后

    再构建图,其实也是一个二维数组。这个图数组代表每个结点,而且数组初始化用0、1表示,象征着结点之间有无连接。

    3、在实现最大连通数组时,主要是采用遍历的方法。在以前的迪杰斯特拉找最短路径的基础上改成寻找最长路径。

    二、代码

    复制代码
    #include <iostream>
    #include <fstream>
    #include<ctime>
    #include <string>
    using namespace std;
    #define N 100
    
    //图的结构体
    typedef struct
    {
        int array_1[N]; //用一位数组存权值
        int array_to_graph[N][N]; //将数组转化成二维图的格式
        int array_length; 
    }Graph;
    
    //遍历图,寻找最长路径
    void ergodic(Graph &number, int node, int selech[], int&road, int&max_road, int line) 
    {
        int node_one,node_two ;//图的两个结点
        int node_f = 0;
        int judge = 0;//判断
        selech[node] = 1; 
        max_road=max_road+number.array_1[node]; 
        if(max_road >=road)
        {
            road =max_road;
        }
        for(node_one= 1; node_one<= number.array_length; node_one++) 
        { 
            for( node_two= 1; node_two <= number.array_length; node_two++) 
            { 
                if((selech[node_one] == 0) && (number.array_to_graph[node_two][node_one] == 1) && (selech[node_two] == 1)) 
                {  
                    node_f = node_one;
                    judge = 1; 
                    break; 
                }
            }
            if(judge== 1)
            {
                break;
            }
        } 
        for(node_one = 1; node_one<= number.array_length; node_one++) 
        {
            for(node_two= 1; node_two<= number.array_length; node_two++) 
            {
                if((selech[node_one] == 0) && (number.array_to_graph[node_two][node_one] == 1) && (selech[node_two] == 1))
                {
                    if(number.array_1[node_f]<number.array_1[node_one])
                    {
                        node_f =node_one;
                    }
                }
            }
        }
        if(road + number.array_1[node_f]<0) 
        { 
            number.array_to_graph[node][node_f] = 0;
        }
        else
        {
            ergodic(number, node_f, selech, road, max_road, line); 
        }
    }
    
    
    int main()
    {
        int i,j;
        int array_array_to_graph[100][100];
        int array_line,array_row;//文本数组的行和列
        char str_1[100];//字符数组,主要是用来存文本按行读入的字符,也就是行、列的值
        ifstream infile("E:\a.txt");
        if(!infile)
        {
            cout<<"open error!"<<endl;
            exit(1);
        }
    
        infile.getline(str_1,sizeof(str_1));//获取文件一行的数据。
        sscanf_s( str_1 , "%d" , &array_line);//取出行值。
        infile.getline( str_1, sizeof(str_1) );
        sscanf_s( str_1 , "%d" , &array_row );//取出的是列值
        
        cout<<"数组为:"<<endl;
        for(int i=0;i<array_line;i++)
        {
           for(int j=0;j<array_row;j++)
           {
                infile>>array_array_to_graph[i][j];
           }
        }
        for(i=0;i<array_line;i++)
        {
           for( j=0;j<array_row;j++)
           {
                cout<<array_array_to_graph[i][j]<<" ";
           }
           cout<<endl;
        }
    
        Graph  number;
        number.array_length=array_line*array_row;
        for( i=0;i<array_line;i++)
        {
            for( j=0;j<array_row;j++)
            {
                number.array_1[i*array_row+j+1]=array_array_to_graph[i][j];//将二维数组转化为一维数组
            }
        }
        //将转换后生成的一维数组转换成二维的图的格式,其中1、0是代表着结点有无连接
        for( i = 1; i <= number.array_length; i +=array_row) 
        { 
            for(j = i; j <= i + array_row - 2; j++) 
            { 
                number.array_to_graph[j][j + 1] = 1; 
                number.array_to_graph[j + 1][j] = 1; 
            }
        }
        for(i = 1+ array_row; i<number.array_length; i +=array_row) 
        {
            for(j = i; j <= i + array_line - 1; j++) 
            { 
                number.array_to_graph[j][j - array_row] = 1; 
                number.array_to_graph[j - array_row][j] = 1;
            } 
        }
        
        int  array_2[N] = { 0};
        
        for( i = 1; i <= number.array_length; i++) 
        { 
            if(number.array_1[i]<0) //如果数组元素都是负数,那么遍历时只要找到最大的负数就可以了
            { 
                array_2[i] =number.array_1[i];
            }
            else
           {
              int select[N] = { 0}; 
              int max_road = 0;
              ergodic(number, i, select, array_2[i], max_road, array_line);
            }
        }
        int max_road = array_2[1];
        for(int i = 2; i <= number.array_length; i++) 
        {
            if(array_2[i]>max_road) 
            {
                max_road =array_2[i];
            }
        }
        cout << "最大联通子数组的和为:"<< max_road <<endl;
     return 0;
    }
    复制代码

    三、截图

     

    项目计划日志(单位:h):

      听课 编写程序 阅读相关书籍 网上查找资料   日总计
    周一 0 0 3 0 3
    周二 0 1 0  0 1
    周三  0 2 0  0 4
    周四 2 1.5  0 0 3.5
    周五  0 2 0 0 4
    周六  0 0 0  0 0
    周日  0  0  0  0  0
    周总计 4 6.5 3 0 13.5

                     时间记录日志(单位:min):

    日期 开始时间 结束时间 中断时间 净时间 活动 备注
     星期一 13:30 17:00 30 180 阅读  
    星期二 19:30 20:30 30 30 编程  
    星期三 14:00  15:00 0  60 编程 数组最大连通数组之和
      19:00 20:00 30 30 编程
    星期四 14:00 15:50 10 100 听课 软件工程上课
      21:30 20:30 0 60 编程 四则运算数组
      19:30 20:30 0 60 编程  最大连通数组之和
    星期五 14:00 16:00 0 120 编程 四则运算数组
    星期六  0          
  • 相关阅读:
    Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
    CAP原则 (阿里)
    分布式系统一致性问题解决实战(阿里) 异步解耦+消息队列可作为分布式系统满足最终一致性的优秀方案
    高并发&高可用系统的常见应对策略 秒杀等-(阿里)
    Redis的内存回收策略和内存上限(阿里)
    如何保证MQ的顺序性?比如Kafka
    spring的controller默认是单例还是多例
    HashMap线程不安全的体现
    TCP的三次握手与四次挥手
    常见排序算法及对应的时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/Megau/p/5359735.html
Copyright © 2011-2022 走看看