【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 @   AWCXV  阅读(581)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
点击右上角即可分享
微信分享提示