Forwards on Weibo (Java实现)

14 篇文章 0 订阅

Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a post on Weibo, all his/her followers can view and forward his/her post, which can then be forwarded again by their followers. Now given a social network, you are supposed to calculate the maximum potential amount of forwards for any specific user, assuming that only L levels of indirect followers are counted.

Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers: N (≤1000), the number of users; and L (≤6), the number of levels of indirect followers that are counted. Hence it is assumed that all the users are numbered from 1 to N. Then N lines follow, each in the format:

M[i] user_list[i]
where M[i] (≤100) is the total number of people that user[i] follows; and user_list[i] is a list of the M[i] users that followed by user[i]. It is guaranteed that no one can follow oneself. All the numbers are separated by a space.

Then finally a positive K is given, followed by K UserID’s for query.

Output Specification:
For each UserID, you are supposed to print in one line the maximum potential amount of forwards this user can trigger, assuming that everyone who can view the initial post will forward it once, and that only L levels of indirect followers are counted.

Sample Input:
7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6
Sample Output:
4
5

**题目大意:**当一个用户发微博时,所有粉丝都能浏览并转发,然后可以被转发者的粉丝继续转发;给定一个网络环境,试计算一个用户的最大转发量(只计算L层粉丝);
输入:第一行:N和L;余下N行,第i个用户的粉丝数+粉丝id列表;最后一行,查询几个用户,id分别为什么;

代码如下:

import java.util.Scanner;

/**
 * 建立图关系
 * 查有多少粉丝(有向图:横查关注,竖查粉丝)
 */
public class Main {
    private int maxLayer;
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Main self = new Main();
        MyGraph graph = self.handleInput(input);
        int temp = input.nextInt();
        for (int i = 0; i < temp; i++) {
            int res = self.BFS(input.nextInt()-1, graph);
            System.out.println(res);
            graph.resetVisited();
        }
    }
    //处理输入
    public MyGraph handleInput(Scanner input){
        MyGraph graph = new MyGraph(input.nextInt());
        this.maxLayer = input.nextInt();
        for (int i = 0; i < graph.getN(); i++) {
            int count = input.nextInt();
            for (int j = 0; j < count; j++) {
                graph.getGraph()[i][input.nextInt()-1] = 1;
            }
        }
        return graph;
    }

    //广度优先搜索
    public int BFS(int node, MyGraph graph){
        MyQue que = new MyQue(graph.getN());
        graph.getVisited()[node] = true;
        que.addQue(node);
        int count = 0;
        int last = node;
        int layer = 0;
        int tail = node;
        while (que.getLen() > 0){
            int temp = que.leaveQue();
            for (int i = 0; i < graph.getN(); i++) {
                if (!graph.getVisited()[i] && graph.getGraph()[i][temp] == 1){
                    que.addQue(i);
                    graph.getVisited()[i] = true;
                    count++;
                    tail = i;
                }
            }
            if (last == temp){
                layer++;
                last = tail;
            }
            if (layer == this.maxLayer){
                break;
            }
        }
        return count;
    }
}
//图对象
class MyGraph{
    private int n;
    private int[] nodes;
    private int[][] graph;
    private boolean[] visited;

    public MyGraph(int n) {
        this.n = n;
        this.graph = new int[this.n][this.n];
        this.visited = new boolean[this.n];
        init();
    }

    private void init(){
        this.nodes = new int[this.n];
        for (int i = 0; i < this.n; i++) {
            this.nodes[i] = i;
        }
    }

    public void resetVisited(){
        for (int i = 0; i < this.visited.length; i++) {
            this.visited[i] = false;
        }
    }

    public int getN() {
        return n;
    }

    public void setN(int n) {
        this.n = n;
    }

    public int[][] getGraph() {
        return graph;
    }

    public void setGraph(int[][] graph) {
        this.graph = graph;
    }

    public boolean[] getVisited() {
        return visited;
    }

    public void setVisited(boolean[] visited) {
        this.visited = visited;
    }

    public int[] getNodes() {
        return nodes;
    }

    public void setNodes(int[] nodes) {
        this.nodes = nodes;
    }
}

class MyQue{
    private int[] que;
    private int top;
    private int rear;

    public MyQue(int len) {
        this.que = new int[len];
        this.top = -1;
        this.rear = -1;
    }

    public void addQue(int node){
        que[++top] = node;
    }

    public int leaveQue(){
        return que[++rear];
    }

    public int getLen(){
        return top-rear;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
SIP(Session Initiation Protocol)是一种应用层协议,用于在IP网络上建立、修改和终止多媒体会话,如语音通话、视频会议等。下面是一个简单的SIP协议的Java实现示例: ```java import java.net.*; import java.io.*; public class SIPProtocolExample { public static void main(String[] args) { try { // 创建SIP请求 String request = "REGISTER sip:example.com SIP/2.0\r\n" + "Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds\r\n" + "From: Alice <sip:alice@example.com>;tag=1928301774\r\n" + "To: Alice <sip:alice@example.com>\r\n" + "Call-ID: a84b4c76e66710\r\n" + "CSeq: 1 REGISTER\r\n" + "Contact: <sip:alice@192.168.1.100:5060>\r\n" + "Max-Forwards: 70\r\n" + "Expires: 3600\r\n" + "Content-Length: 0\r\n\r\n"; // 创建UDP套接字并发送SIP请求 DatagramSocket socket = new DatagramSocket(); InetAddress address = InetAddress.getByName("example.com"); DatagramPacket packet = new DatagramPacket(request.getBytes(), request.length(), address, 5060); socket.send(packet); // 接收SIP响应 byte[] buffer = new byte[1024]; DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length); socket.receive(responsePacket); String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); System.out.println(response); // 关闭套接字 socket.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上面的示例演示了如何使用UDP套接字发送和接收SIP请求和响应。在实际应用中,需要根据具体需求进行更复杂的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值