内存错误导致更高的值

时间:2017-09-04 17:13:12

标签: java

问题陈述是: HackerLand的统治者认为,该国的每个公民都应该可以访问图书馆。不幸的是,HackerLand被龙卷风击中,摧毁了所有的图书馆并阻碍了它的道路!由于您是HackerLand最伟大的程序员,统治者希望您的帮助能够修复道路并有效地建立一些新的库。

HackerLand有n个城市编号从1到n。城市通过双向道路连接。如果出现以下情况,公民可以访问图书馆:

他们的城市包含一个图书馆。 他们可以通过公路从他们的城市到包含图书馆的城市。 修理任何道路的费用是y美元,在任何城市建造图书馆的费用是x美元。

您将获得q个查询,其中每个查询都包含一个HackerLand地图以及x和y的值。

对于每个查询,找到让所有公民都可以访问图书馆的最低费用,并将其打印在新行上。

内存错误java堆大小每当我输入更大的值,如90k或更多为n,m为更小的值代码工作正常!!!! 这个问题与图论有关,而am是邻接矩阵 前两行输入是: 10 78148 11354 90581 83503       包解决方案22;

  import java.io.*;
  import java.util.*;
  import java.text.*;
  import java.math.*;
  import java.util.regex.*;

   public class Solution22 
  {

public static void main(String[] args) 
{
    Scanner in = new Scanner(System.in);
    int q = in.nextInt();
    for(int a0 = 0; a0 < q; a0++)
    {
        int n = in.nextInt();
        int m = in.nextInt();
        long x = in.nextLong();
        long y = in.nextLong();
        int[][] am=new int [n+1][n+1];
        long total=0; 
        for(int a1 = 0; a1 < m; a1++)
        {
            int city_1 = in.nextInt();
            int city_2 = in.nextInt();
            am[city_1][city_2]=am[city_2][city_1]=1;
        }
        if(x<y)
        {
            total=n*x;
        }
        else
        {
            long[] tc=new long[n+1];
            boolean[] cl=new boolean[n+1];
            tc[1]=x;
            cl[1]=true;
            for(int i=2;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(am[i][j]==1&&cl[j])
                    {
                        tc[i]=y;
                        cl[i]=true;
                        break;
                    }
                }
                if(!cl[i])
                {
                    tc[i]=x;
                    cl[i]=true;
                }
            }
            for(int i=1;i<=n;i++)
            {
                total+=tc[i];
            }
        }
        System.out.println(total);
    }
}
  }

该代码适用于较小的n m x y

0 个答案:

没有答案