[Descripción del problema]
Xiao Ming está haciendo un experimento de red.
Él configuró n computadoras, llamadas nodos, para enviar, recibir y almacenar datos.
Inicialmente, todos los nodos son independientes y no hay conexión.
Xiao Ming puede conectar dos nodos a través de un cable de red y los dos nodos pueden comunicarse entre sí después de la conexión
. Si dos nodos están conectados por un cable de red, se denominan adyacentes.
Xiao Ming a veces prueba la red en ese momento. Él enviará un mensaje a un nodo, y el mensaje se enviará
a cada nodo adyacente, y luego estos nodos se reenviarán a sus nodos adyacentes hasta que todos los nodos adyacentes directa
o indirectamente. todos han recibido la información. Todos los nodos emisores y receptores almacenarán la información.
Un dato se almacena solo una vez.
Dado el proceso de conexión y prueba de Xiaoming, calcule el tamaño de la información almacenada en cada nodo.
[Formato de entrada]
La primera línea de entrada contiene dos números enteros n, m, que representan respectivamente el número de nodos y el número de operaciones. Los nodos están
numerados del 1 al n.
En las siguientes m líneas, tres números enteros en cada línea representan una operación.
Si la operación es 1 ab, significa que el nodo ay el nodo b están conectados por un cable de red. Cuando a = b
, significa que hay un bucle automático conectado, lo que no tiene un impacto sustancial en la red.
Si la operación es de 2 pt, significa que se envía un mensaje de tamaño t en el nodo p.
[Formato de salida]
Muestra una línea, que contiene n enteros, separados por un espacio entre enteros adyacentes, indicando a su vez
el tamaño de la información almacenada en el nodo 1 al nodo n después de que se realizan las operaciones anteriores.
Idea de resolución de problemas : hable sobre la división de temas, ingrese los nodos de acuerdo con los requisitos y almacene la matriz nombrada, lea los nombres por turno y luego analice si conectar los nodos o transmitir datos. Si los nodos están conectados, el conocimiento de la lista enlazada se utiliza Para encadenar diferentes nodos en dos direcciones, si se va a transmitir datos, es combinar recursividad y lista enlazada, y almacenar la cantidad correspondiente de datos en cada nodo a su vez.
package 蓝桥杯;
import java.util.*;
public class 网络分析 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//定义共有n个节点
int n = in.nextInt();
//定义共有m条操作
int m = in.nextInt();
List<wangLuoNode> node = new ArrayList<wangLuoNode>();
int[][] log = new int[m][3];
//创建节点
for(int i = 0;i < n;i++) {
wangLuoNode next = new wangLuoNode(i,0);
node.add(next);
}
//输入操作
for(int i = 0;i < m;i++) {
for(int j = 0;j < 3;j++) {
log[i][j] = in.nextInt();
}
}
//查看节点信息量
for(wangLuoNode temp:node) {
System.out.println(temp.num+"号节点信息量为:"+temp.sum);
}
//执行命令
for(int i = 0;i < m;i++) {
//连接节点
if(log[i][0] == 1) {
if(log[i][1] != log[i][2]) {
node.get(log[i][1]-1).node.add(node.get(log[i][2]-1));
System.out.println();
System.out.println(log[i][1]+"和"+log[i][2]+"建立连接了!");
node.get(log[i][2]-1).node.add(node.get(log[i][1]-1));
System.out.println();
System.out.println(log[i][2]+"和"+log[i][1]+"建立连接了!");
}
}
//传输数据
else {
int[] flag = new int[n];
//给某个节点传输多少的量
transhu(flag,node.get(log[i][1]-1),log[i][2]);
//查看节点信息量
System.out.println();
for(wangLuoNode temp:node) {
System.out.println(temp.num+"号节点信息量为:"+temp.sum);
}
System.out.println();
System.out.println(log[i][1]+"传输了"+log[i][2]+"的信息!");
}
}
}
//进行遍历传输
public static void transhu(int[] flag, wangLuoNode node,int text) {
if(node.node.size() == 0) {
node.sum += text;
return;
}
for(int i = 0;i < node.node.size();i++){
if(flag[node.node.get(i).num] != 1) {
node.node.get(i).sum += text;
flag[node.node.get(i).num] = 1;
}else {
continue;
}
transhu(flag,node.node.get(i),text);
}
}
}
class wangLuoNode{
int num;
int sum;
List<wangLuoNode> node = new LinkedList<wangLuoNode>();
public wangLuoNode(int num,int sum) {
this.sum = sum;
this.num = num;
}
}