问题陈述是: 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
值