java-MT15 病毒传播
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
public class Main {
private static HashSet<Integer> infected;
private static HashSet<Integer>[] adj;
private static int t;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
solution(in);
}
}
/**
* 模拟法: bfs
* @param in
*/
private static void solution(Scanner in){
// 点数
int V = in.nextInt();
// 边数
int E = in.nextInt();
// 构建图 点的范围[1:V]
adj = new HashSet[V+1];
for(int i=1; i<=V; i++){
adj[i] = new HashSet<>();
}
int v1,v2;
for(int i=1; i<=E; i++){
v1 = in.nextInt();
v2 = in.nextInt();
// 去环
if(v1 != v2){
adj[v1].add(v2);
adj[v2].add(v1);
}
}
// 感染病毒的点集infected
int k = in.nextInt();
t = in.nextInt();
infected = new HashSet<>();
for(int i=1; i<=k; i++){
infected.add(in.nextInt());
}
// bfs
List<Integer> result = new ArrayList<>();
for(int i=1; i<=V; i++){
if(bfs(i)){
result.add(i);
}
}
// 输出
if(result.size() == 0){
System.out.println(-1);
}else{
int size = result.size();
for(int i=0; i<size-1; i++){
System.out.print(result.get(i));
System.out.print(" ");
}
System.out.print(result.get(size-1));
}
}
/**
* 广度优先搜索
* @param start
* @return
*/
private static boolean bfs(int start){
HashSet<Integer> visited = new HashSet<>();
Queue<Integer> queue = new LinkedList<>();
if(infected.contains(start)){
visited.add(start);
queue.offer(start);
}
int days = 0;
while(!queue.isEmpty()){
Integer u;
for(int i=queue.size(); i > 0; i--){
u = queue.poll();
for(Integer v: adj[u]){
if(!infected.contains(v)){
return false;
}else if(!visited.contains(v)){
visited.add(v);
queue.offer(v);
}
}
}
if(++days == t){
break;
}
}
return visited.size() == infected.size();
}
}