千里码:热点营销-1

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

题目如下

现在的问题来了,这是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值