【Codeforces 1106D】Lunar New Year and a Wander
【链接】 我是链接,点我呀:)
【题意】
【题解】
显然每次找最小的标号 用一个集合维护当前能够到达的最小标号 一开始集合里面只有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);
}
}
}
}
}