千里码:热点营销-1

来源:互联网 发布:天津大学软件工程学院 编辑:程序博客网 时间:2024/05/18 14:12

这是千里码的一个热点营销的题,记一下自己的解题思路

题目如下

现在的问题来了,这是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,用数组存用户关系图会内存溢出,似乎该想想其他办法

0 0
原创粉丝点击