牛客网真题-56-最多认识新人

小A最多会新认识的多少人

http://www.nowcoder.com/questionTerminal/1fe6c3136d2a45fa8ef555b459b6dd26

图的深度遍历或广度遍历java都试过了93.3%超时。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException{
        //        Scanner scanner = new Scanner(System.in);
        //        int n = Integer.parseInt(scanner.nextLine());
        //        int ai = Integer.parseInt(scanner.nextLine());
        //        int m = Integer.parseInt(scanner.nextLine());
        BufferedReader buffR = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(buffR.readLine());
        int ai = Integer.parseInt(buffR.readLine());
        int m = Integer.parseInt(buffR.readLine());
        HashMap<Integer, HashSet> map = new HashMap<>();
        for(int i = 0; i < m; i++){
            String[] s = buffR.readLine().split(",");
            int node1 = Integer.parseInt(s[0]), node2 = Integer.parseInt(s[1]);
            if(!map.containsKey(node1)){
                map.put(node1, new HashSet());
            }
            if(!map.containsKey(node2)){
                map.put(node2, new HashSet());
            }
            map.get(node1).add(node2);
            map.get(node2).add(node1);
        }
        HashSet<Integer> set = new HashSet<>();
        set.add(ai);
        HashSet<Integer> arrive = map.get(ai);
        int size1 = arrive.size();
        //        while (!arrive.isEmpty()) {
        //            HashSet<Integer> temp = new HashSet<>();
        //            for(Integer k : arrive){
        //                //如果k没有访问过
        //                if(!set.contains(k)){
        //                    temp.addAll(map.get(k));
        //                    set.add(k);
        //                }
        //            }
        //            arrive = temp;
        //        }
        //        System.out.println(set.size() - size1 - 1);
        Queue<Integer> queue = new LinkedList<>();
        queue.add(ai);
        while (!queue.isEmpty()) {
            HashSet<Integer> temp = map.get(queue.poll());
            for(Integer t : temp){
                if(!set.contains(t)){
                    set.add(t);
                    queue.offer(t);
                }
            }
        }
        System.out.println(set.size() - size1 - 1);
    }
}
全部评论
import java.util.Scanner; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int ai = in.nextInt(); int m = in.nextInt(); Map<integer>> records = new HashMap<>(); for(int i = 0; i < m; i++) { String[] strs = in.next().split(","); int val1 = Integer.parseInt(strs[0]), val2 = Integer.parseInt(strs[1]); if(!records.containsKey(val1)) records.put(val1, new ArrayList<integer>()); if(!records.containsKey(val2)) records.put(val2, new ArrayList<integer>()); records.get(val1).add(val2); records.get(val2).add(val1); } int b= records.get(ai).size(); List<integer> lists=new ArrayList<integer>(); lists.add(ai); int index=0; while(lists.size()>index&&records.size()>0) { int tmp=lists.get(index); boolean a=false; for(Integer num:records.get(tmp)) { if(!lists.contains(num)) { lists.add(num); a=true; } } if(a) { records.remove(tmp); } index++; } System.out.println(lists.size()-1-b); } } //后面就改了下,对查过的记录进行Remove</integer></integer></integer></integer></integer>
点赞 回复 分享
发布于 2021-10-13 22:37
看讨论结果,把图结构中的HashSet改成ArrayList就不会超时了。感觉是两个在查找的花费时间上不一样。
点赞 回复 分享
发布于 2020-06-22 15:35

相关推荐

仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
04-27 08:59
常州大学 Java
牛客139242382号:《两门以上汇编语言》
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务