Fila de asientos (25 puntos)

Fila de asientos (25 puntos)

Lo más sutil de organizar un banquete es organizar los asientos para todos los invitados que asisten al banquete. En cualquier caso, ¡no puedes alinear a dos rivales en la misma mesa de banquete! Esta ardua tarea ahora se le confía a usted. Para cualquier par de invitados, por favor escriba un programa para decirle al anfitrión si pueden organizarse para sentarse juntos.

Formato de entrada:
Ingrese la primera línea para dar 3 enteros positivos: N (≤100), es decir, el número total de invitados que asistieron al banquete, luego estas personas se numeran del 1 al N; M es la relación conocida entre el Número de dos invitados; K es el número de consultas. Luego, M líneas, cada línea da la relación entre un par de invitados, el formato es: relación de invitado 1 invitado 2, donde la relación es 1 significa amigos, -1 significa oponentes muertos. Tenga en cuenta que dos personas no pueden ser a la vez amigos y enemigos. En las últimas K líneas, cada línea proporciona un par de números de invitados que deben consultarse.

Aquí se asume que los amigos de los amigos también son amigos. Pero el enemigo del enemigo no es necesariamente un amigo, y el enemigo de un amigo no es necesariamente un enemigo. Solo una relación hostil puramente directa es absolutamente imposible de sentar juntos.

Formato de
salida : envíe una fila de resultados para cada consulta: si dos invitados son amigos y no hay una relación hostil, entonces la salida No hay problema; si no son amigos pero no hostiles, entonces la salida es OK; si no son hostiles Si hay hostilidad entre ellos, pero también hay amigos en común, la salida está bien pero ...; si solo hay hostilidad entre ellos, la salida es De ninguna manera.

Ejemplo de entrada:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7-1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
Ejemplo de salida:
No hay problema
OK
OK pero. .. De
ninguna manera

#include<bits/stdc++.h>
using namespace std;
int enemy[111][111];
int f[550];
int get(int x)
{
    
    
    if(x==f[x])
    return x;
    else
        return f[x]=get(f[x]);
}
void join(int x,int y)
{
    
    
    int xx=get(x);
    int yy=get(y);
    if(xx>yy)
        f[xx]=yy;
    else
        f[yy]=xx;
}
int main()
{
    
    
   int n,m,k;
      scanf("%d%d%d",&n,&m,&k);
   for(int i=1;i<=n;i++)
         f[i]=i;
   for(int i=1;i<=m;i++)
   {
    
    
       int a,b,d;
       scanf("%d%d%d",&a,&b,&d);
       if(d==1)
       {
    
    
           join(a,b);
       }
      else
       {
    
    
           enemy[a][b]=enemy[b][a]=1;
       }
   }
   for(int i=1;i<=k;i++)
   {
    
    
       int x,y;
       scanf("%d%d",&x,&y);
       int xx=get(x);
       int yy=get(y);
       if(xx==yy&&enemy[x][y]==0)
        printf("No problem\n");
       else if(xx==yy&&enemy[x][y]==1)
        printf("OK but...\n");
        else if(xx!=yy&&enemy[x][y]==0)
        printf("OK\n");
        else if(xx!=yy&&enemy[x][y]==1)
        printf("No way\n");

   }
   return 0;
}

Supongo que te gusta

Origin blog.csdn.net/a675891/article/details/115254783
Recomendado
Clasificación