【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);
				}
			}
		}
		
		
	}

}
posted @ 2019-02-04 11:07  AWCXV  阅读(579)  评论(0编辑  收藏  举报