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);
}
}