这是千里码的一个热点营销的题,记一下自己的解题思路
题目如下
现在的问题来了,这是100个微信用户的关系列表。为了方便表达,把名字变成一个整数,这100个用户的名字分别为1-100。每行有两个名字,代表这两人互为微信好友。
你需要使一个广告让这100个微信用户都看到,请问初始至少将这条广告传播给几个人?假设这条广告编写得很精美,因此用户们看到一定会转发在他的朋友圈让他的朋友看到的。
首先想到的是用图论的知识解题,在一个连通图中,广告只需要传播给一个人就可以让该图中的所有用户看到,所以题目转化为求好友关系图的连通分支的个数。
微信用户的好友关系可以用图表示,可以把图存在一个邻接矩阵中,下面的代码读取文件初始化邻接矩阵int graph[100][100]
public static void graphInitialize(){
try{
FileReader fr =
new FileReader("E:/dev/java/javaweb/qlcoder/144341511030664.txt");
BufferedReader br = new BufferedReader(fr);
String in = null;
while((in = br.readLine()) != null){
String[] fragment = in.split(" ");
int one = Integer.valueOf(fragment[0]) - 1;
int two = Integer.valueOf(fragment[1]) - 1;
graph[one][two] = graph[two][one] = 1;
}
br.close();
}catch(IOException e){
e.printStackTrace();
}
}
下面是求图的连通分支的个数,用的是遍历的方法,从任意一点开始DFS,一次DFS完成时则搜索完了一个连通分支;然后任选一个未访问节点开始下一次DFS,并且连通分支个数count
增1;直至所有节点都被访问,则求解结束。
public static void main(String[] args){
graphInitialize();
//put all users into unvisited set
for (int i = 0; i < 100; i++){
unvisited.add(i);
}
//the amount of connected components
int count = 0;
//DFS all users
while(!unvisited.isEmpty()){
count++;
dfs(unvisited.get(0));
}
System.out.println(count);
}
public static void dfs(int s){
//put s into the visited set
visited.add(s);
unvisited.remove(new Integer(s));
for(int j = 0; j < 100; j++){
if(graph[s][j] == 1 && !visited.contains(j)){
dfs(j);
}
}
}
这是热点营销的第一题,数据量较小,上面的程序跑着没问题
但是第二题用户量增加到100000,用数组存用户关系图会内存溢出,似乎该想想其他办法