【Codeforces 1106D】Lunar New Year and a Wander

【链接】 我是链接,点我呀:)
【题意】


让你遍历n个节点,访问过的节点不操作。
如果是没有访问过的点,那就把它加到序列的末尾.
问你形成的最小字典序的序列是多少。

【题解】


显然每次找最小的标号
用一个集合维护当前能够到达的最小标号
一开始集合里面只有1
然后每次取出来最小的节点然后到达那个节点。
然后把和那个点相邻的节点全都加入到集合中(如果没有访问过)
已经访问过的点是可以重复走的。
所以可以一层一层地往外扩展"可以到达的节点集合"
重复上述步骤n次即可
有点像最短路的蓝白点思想,

【代码】

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;


public class Main {
        
    static int n,m;
    static ArrayList<Integer> g[];
    static boolean tag[];
    static TreeSet<Integer> myset;;
    
    public static void main(String[] args) throws IOException{
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        n = in.nextInt();m = in.nextInt();
        g = new ArrayList[n+10];
        tag = new boolean[n+10];
        myset = new TreeSet();
        
        for (int i = 1;i <= n;i++) g[i] = new ArrayList<>();
        
        for (int i = 0;i < m;i++) {
            int x,y;
            x = in.nextInt();y = in.nextInt();
            g[x].add(y);g[y].add(x);
        }
        
        myset.add(1);
        for (int i = 1;i <= n;i++) {
            int tag1 = myset.first();
            myset.remove(tag1);
            System.out.print(tag1+" ");
            tag[tag1] = true;
            for (int j = 0;j < (int)g[tag1].size();j++) {
                int y = g[tag1].get(j);
                if (tag[y]==false) {
                    myset.add(y);
                }
            }
        }
        
        
    }

}

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/10351542.html