Triángulo de amor (HDU 4324)

tema Enlace

título Descripción

Recientemente, los científicos encuentran que hay amor entre cualquiera de dos personas. Por ejemplo, entre A y B, si A no hacer el amor B, entonces B debe amar A, viceversa. Y no hay ninguna posibilidad de que dos personas se aman, lo que es un mundo loco!
Ahora, los científicos quieren saber si hay o no un “Triángulo de Amor” entre N personas. “Triángulo de amor” significa que entre las tres personas (A, B y C), A ama a B, B y C ama C ama A.
Su problema es escribir un programa para leer la relación entre las N personas en primer lugar, y la de regreso si o no hay un “Triángulo de Amor”.

Formato de entrada

La primera línea contiene un único entero t (1 <= t <= 15), el número de casos de prueba.
Para cada caso, la primera línea contiene un entero N (0 <n <= 2,000).
En la siguiente N líneas contienen la matriz de adyacencia A de la relación (sin espacios). Ai, j = 1 significa i-th gente ama j-ésimo personas, de lo contrario Ai, j = 0.
Se garantiza que la relación dada es un torneo, es decir, Ai, i = 0, Ai, j ≠ Aj, i (1 <= i, j <= n, i ≠ j).

Formato de salida

Para cada caso, el número de salida de caja como se indica a continuación, imprimir “Sí”, si hay un “Triángulo de Amor” entre estas personas N, de lo contrario imprimir “No”.
Tome el ejemplo de salida para más detalles.

Ejemplo de entrada

2
5
00 100
10,000
01,001
11101
11000
5
01111
00000
01000
01100
01110

Ejemplo de salida

Caso # 1: Sí
Caso # 2: No se

análisis

Título efecto un gráfico dado n vértices dirigidos, se determina si la clasificación topológica.
plantilla recta para determinar si no puede ser topológicamente ordenadas anillos representantes.

fuente

#include <bits/stdc++.h>
#define MAXN 2005
using namespace std;
int t,n,cnt=0,in[MAXN];
bool g[MAXN][MAXN];
int read()
{
	int sum;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	sum=c-'0';
	return sum;
}
bool TopSort()
{
	queue<int> q;
	for(int i=1;i<=n;i++)
		if(!in[i])q.push(i);
	int k=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		k++;
		for(int i=1;i<=n;i++)
			if(g[u][i]){
				in[i]--;
				if(!in[i])q.push(i);
			}
	}
	if(k!=n)return false;
	return true;
}
int main()
{
	scanf("%d",&t);
	while(t--){
		memset(in,0,sizeof(in));
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				int tmp=read();
				g[i][j]=tmp;
				if(tmp)in[j]++;
			}
		}
		if(TopSort())printf("Case #%d: No\n",++cnt);
		else printf("Case #%d: Yes\n",++cnt);
	}
}
Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 132

Supongo que te gusta

Origin blog.csdn.net/weixin_43960284/article/details/105237223
Recomendado
Clasificación