El diseño del programa de pensamiento y de práctica operaciones Week6 (3/4 clases / datos)

Krypton cinta de oro del este

laboratorio original con un ordenador (Nº 1), recientemente kriptón división de banda de oro cuco Oriente, sino también para la compra de equipos de laboratorio N-1, el número 2 a N. Cada ordenador conectado a un ordenador con un cable instalado previamente. Pero cuco Medio velocidad de preocupación es demasiado lento, lo que quería saber el cable de red i-computadora a una longitud máxima de otros equipos, pero pobre del este de cuco sufrió recientemente una caída de la sabiduría de los rayos cósmicos, ayuda por favor él.

Nota: esta figura corresponde a la muestra de entrada, a partir de esta figura se puede ver, el número 1 más alejado del equipo es un equipo PC 4, la distancia entre ellos es de 3. No. 4 y No. 5 ordenadores PC son más alejado del punto de la computadora 2, así que la respuesta es No. 2.5 No. 3 más alejada de la PC de la computadora, el ordenador 3 es así que para su respuesta es 3. Lo mismo podemos calcular la respuesta del ordenador número 4 y No. 5 PC es 4.

Entrada

El archivo de entrada contiene varios casos de prueba. Para cada prueba, la primera fila de un número entero N (N <= 10000), hay N-1 la siguiente fila, cada fila dos números, para la i-ésima fila de los dos números que representan el número de ordenadores conectados a la i número de equipo y la longitud del cable entre ellos. La longitud total del cable no exceda de 10 ^ 9, separadas por un espacio entre cada número.

Output

Para cada conjunto de línea de salida de datos de prueba N, la respuesta i representa el i-ésimo número de fila de la computadora (1 <= i <= N ).

Sample Input
5
1 1
2 1
3 1
1 1
Sample Output
3
2
3
4
4

análisis

Este problema es un buscan diámetro derivados

identificar primero los dos puntos finales, el método es para seleccionar cualquiera de los punto grabado a su punto más alejado, punto final debe ser un diámetro. Empezando por un extremo, encontrar el punto más lejano, es el otro punto final.

Buscando un máximo y luego se convierte a una ruta de punto-a-extremo.

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+5;
struct edge{
	int p,w;
	edge(int _p, int _w):p(_p), w(_w){
	}
};
vector<edge> points[N];
int path[N];
int a, b, s;
int maxl;
void DFS(int u, int v, int l){
	int next,w;
	if(l > maxl){
		s=u;
		maxl=l;
	}
	for(int i=0; i<points[u].size(); ++i)
	{
		next=points[u][i].p;
		w=points[u][i].w;
		if(next==v)continue;
		int new_l=w + l;
		DFS(next, u, new_l);
		path[next]=max(path[next], new_l);
	} 
}
int main(){
	int n;
	while(cin>>n){
		maxl=0;
		for(int i=1;i<=n;i++){
			points[i].clear();
		}
		for(int i=2;i<=n;i++){
			cin>>a>>b;
        	points[i].push_back(edge(a,b));
        	points[a].push_back(edge(i,b));
		}
		memset(path,0,sizeof(path));
		DFS(1,0,0);
		DFS(s,0,0);
		DFS(s,0,0);
		for(int i=1;i<=n;i++){
			cout<<path[i]<<endl;
		}
	}
	return 0;
}

El uso de máscaras!

Novel neumonía coronavirus (virus de la corona de Enfermedades 2019, COVID- 19), referido como "el nuevo neumonía corona" se refiere a la 2019 novela infección por coronavirus causada por neumonía.
Si una persona infectada en un grupo, entonces este grupo necesidad de aislarse!
Un pequeño estudiante se le diagnosticó la infección nueva corona, y no usa una máscara! ! ! ! ! !
Riesgo! ! !
El tiempo se acaba! ! ! !
Necesidad de encontrar lo más rápidamente posible a todos los estudiantes y pequeña Un contacto directo o indirecto a través de los estudiantes, que será aislado para evitar la propagación de una gama más amplia.
Como todos sabemos, la comunicación de los estudiantes pueden estar en grupos pequeños, un estudiante también puede participar en varios grupos pequeños.
Por favor, escriba un programa para resolver! Use una máscara! !

De entrada

conjuntos múltiples de datos, para cada prueba:
los dos primeros actos de números enteros ny m( n = m = 0representa el extremo de entrada, sin tratamiento), nel número de estudiantes, mel número de grupos de estudiantes. 0 < n <= 3e4 , 0 <= m <= 5e2
Número de estudiante es 0~n-1
pequeña A numerada 0
Posteriormente, mlíneas, tienen cada uno un número entero numnúmero que es un pequeño grupo de personal. Luego están numentero que representa los estudiantes en grupos pequeños.

Salida

Número de la salida a ser aislado, la respuesta a la salida de cada de datos por línea

Sample Input
100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
200 2
1 5
5 1 2 3 4 5
1 0
0 0
Sample Output
4
1
1

análisis

Debido a la gran cantidad de matriz de almacenamiento utilizando la lista de simulación.

Disjuntos-set, cada vez que miras, la idea de utilizar la compresión ruta, el nodo primario actual directamente consulta nodo se convierte en el nodo raíz.

El número de nodos de la salida final de las respuestas, es necesario contar el número de pacientes y 0 con el pueblo, tenemos que encontrar el tiempo para asegurarse de que no aparece en grupo con una variedad de valor del nodo padre, y 0 pacientes después de las estadísticas del nodo misma padres fuera puede ser.

#include<iostream>
#include<cstdio>

using namespace std;

const int N=3e4+5;


int parent[N];

int find(int x)
{
	if(x!=parent[x]){
		int m=find(parent[x]);
		parent[x]=m;
		return m;
	}
	return x;
}

int Union(int a, int b){
	int _a=find(a);
	int _b=find(b);
	if(_a!=_b){
		parent[_a]=_b;
	}
}

int main()
{
	int m,n;
	while((~scanf("%d%d",&n,&m))&&!(m==0&&n==0))
	{
		for(int i=0;i<n;++i)
		{
			parent[i]=i;
		}
		for(int i=0;i<m;++i)
		{
			int t;
			scanf("%d",&t);
			int* temp =new int[t];
			for(int k=0;k<t;++k){
				scanf("%d",&temp[k]);
				if(k>0){
					Union(temp[k],temp[0]);
				}
			}
			delete[]temp;
		}
		int zero=find(0);
		int sum=1;
		for(int i=1;i<n;++i)
		{
			if(find(i)==zero){
				sum++;
			}
		}
		printf("%d\n",sum);
	}
	return 0;
 } 

magia agarrar Tokai I

Cosas aburridas en casa en el campo, como la agricultura. Hay tierras de cultivo n bloques, numerados del 1 ~ n.
Para el riego agrícola Rui
Es bien sabido que la materia es un mago, que puede consumir una cierta MP en su magia en un campo de modo que el agua del río Amarillo hacia el cielo. También puede consumir una cierta cantidad de MP Portal establecido en los dos campos de drenaje, por lo que este pedazo de agua potable Tian Tian con agua. (1 <= n <= 3e2 )
el consumo de agua del río Amarillo es el cielo Wi, i es el número de campos agrícolas (1 <= Wi <= 1e5 )
para establecer un consumo portal Pij, i, j es el número de campos agrícolas (1 <= Pij <= 1e5, Pij = PJI , Pii = 0)
campo cosas para todo el consumo mínimo de riego Rui

Entrada

Línea 1: un número n
fila 2 a la fila n + 1: un número wi
de la n + 2 ª fila a fila 2n + 1: Matrix Matrix es decir pij

La salida

del valor de las cosas MP consumo mínimo

Ejemplo

Input
4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
Output
9

análisis

El análisis del significado de los problemas y saber que este es un problema árbol de expansión mínima.

Nodo 0 se supone que el agua, caminos del agua a otros nodos y otros nodos de la trayectoria entre la distancia conocida, simplemente use primel valor de la figura de comunicación mínimo.

Una cosa a destacar es que el tiempo máximo establecido, establece preferiblemente a no más del 0x3fffffffuso del tiempo de llenado fill(), o puede ser malo.

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int maxv=1e5+5;
const int maxn=0x7fffffff;
struct Node{
	int v,dis;
	Node(int _v, int _dis):v(_v),dis(_dis){
	}
	Node():v(0),dis(0){
	}
};
vector<Node> Adj[maxv];
int n;
int d[maxv];
bool vis[maxv]={false};
int prim(){
	fill(d,d+maxv,maxn);
	d[0]=0;
	int ans=0;
	for(int i=0;i<n;++i){
		int u=-1,MIN=maxn;
		for(int j=0;j<n;++j){
			if(vis[j]==false&&d[j]<MIN){
				u=j;
				MIN=d[j];
			}
		}
		if(u==-1) return -1;
		vis[u]=true;
		ans+=d[u];
		for(int j=0;j<Adj[u].size();++j){
			int v=Adj[u][j].v;
			if(vis[v]==false&&Adj[u][j].dis<d[v]){
				d[v]=Adj[u][j].dis;
			}
		}
	}
	return ans;
}

int main()
{
	scanf("%d",&n);
	n++;
	int t;
	for(int i=1;i<n;++i){
		scanf("%d",&t);
		Adj[0].push_back(Node(i,t));
		Adj[i].push_back(Node(0,t));
	}
	for(int i=1;i<n;++i){
		for(int j=1;j<n;++j)
		{
			scanf("%d",&t);
			if(t==0){
				continue;
			}
			Adj[i].push_back(Node(j,t));
		}
	}
	printf("%d\n",prim());
	return 0;
}

Centro de datos

Ver el título original http://118.190.20.162/view.page?gpid=T83

análisis

El título es muy largo, pero sigue siendo un problema de expansión mínima árbol de

indicación de la naturaleza de Kruskal algoritmo de árbol de expansión o mínimo, y la salida a continuación, la mayor longitud del lado de la arista seleccionada.

Kruskal idea es determinar un punto como punto de inicio, añadiendo cada vez un punto al punto más corto, y actualiza su distancia a otros puntos.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n, m, i, j, u, v, total;
struct Edge{
    int start, to;
    int val;
    operator < (const Edge& edge){
    	return val<edge.val;
	}
};
Edge edge[500005];
int pre[100005];
 
int find(int x){
    if(pre[x] == x){
        return x;
    }else{
        pre[x]=find(pre[x]);
        return pre[x];
    }   
}
int kruskal(){
	int ans=0;
    for(int i = 1; i <= m; i++){
        u=find(edge[i].start);
        v=find(edge[i].to);
        if(u == v) continue;
        ans = ans>edge[i].val?ans:edge[i].val;
        pre[u] = v;
        total++;
        if(total == n - 1) break;
    }
    return ans;
}
int main(){
    cin >> n >> m;
    int root;
    cin >> root;
    for(i = 1; i <= n; i++) pre[i] = i;
    for(i = 1; i <= m; i++){
        cin >> edge[i].start >> edge[i].to >> edge[i].val;
    }
    sort(edge + 1, edge + m + 1);
    cout<<kruskal()<<endl;
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/master-cn/p/12625794.html
Recomendado
Clasificación