[PTA] Asientos en fila L2-010 (25 puntos) [cobro simple y cheque]

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 un amigo de un amigo también es un amigo. 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 línea de resultado para cada consulta: si los 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 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.

Muestra 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

Salida de muestra:

No problem
OK
OK but...
No way

Código:

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,k,a,b,c,fa[110],g[110][110]={
    
    0};

int find(int x){
    
     //找根(路径压缩)
	return x==fa[x]?x:fa[x]=find(fa[x]);
} 

void Union(int a,int b) //合并
{
    
    
	a=find(a);
	b=find(b);
	if(a!=b) fa[a]=b;
}

int main()
{
    
    
	cin>>n>>m>>k;
	
	for(int i=1;i<=n;i++) fa[i]=i; //初始化
	
	for(int i=0;i<m;i++)
	{
    
    
		cin>>a>>b>>c;
		g[a][b]=g[b][a]=c;
		if(c==1) Union(a,b);
	}
	
	for(int i=0;i<k;i++)
	{
    
    
		cin>>a>>b;
		if(g[a][b]==1) cout<<"No problem"<<endl;
		else if(g[a][b]!=1 && g[a][b]!=-1) cout<<"OK"<<endl;
		else if(g[a][b]==-1 && find(a)==find(b)) cout<<"OK but..."<<endl;
		else if(g[a][b]==-1) cout<<"No way"<<endl;
	}
   	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45260385/article/details/109752008
Recomendado
Clasificación