Sièges de la rangée PTA L2-010 (recherche combinée)

L2-010 rangée de sièges (25 points)

La chose la plus subtile dans l'organisation d'un banquet est de prévoir des sièges pour tous les invités qui viennent au banquet. Dans tous les cas, impossible d'aligner deux rivaux à la même table de banquet! Cette tâche ardue vous est maintenant confiée. Pour toute paire d'invités, veuillez rédiger un programme pour dire à l'hôte s'il peut être organisé pour s'asseoir ensemble.

Format d'entrée:
entrez la première ligne pour donner 3 nombres entiers positifs: N (≤100), c'est-à-dire le nombre total d'invités qui sont venus au banquet, ces personnes sont numérotées de 1 à N; M est la relation connue entre les deux invités Nombre; K est le nombre de requêtes. Puis M lignes, chaque ligne donne la relation entre une paire d'invités, le format est: invité 1 invité 2 relation, où relation 1 signifie ami, -1 signifie adversaire mort. Notez que deux personnes ne peuvent pas être à la fois amis et ennemis. Dans les K dernières lignes, chaque ligne donne une paire de numéros d'invités à interroger.

On suppose ici que les amis d'amis sont aussi des amis. Mais l'ennemi de l'ennemi n'est pas nécessairement un ami, et l'ennemi d'un ami n'est pas nécessairement un ennemi. Seule une relation hostile purement directe est absolument impossible de s'asseoir ensemble.

Format de
sortie : sortie une ligne de résultat pour chaque requête: si les deux invités sont amis et qu'il n'y a pas de relation hostile, alors sortie Pas de problème; s'ils ne sont pas amis mais pas hostiles, alors sortie OK; s'ils ne sont pas hostiles S'il y a de l'hostilité entre eux, mais qu'il y a aussi des amis en commun, alors sortie OK mais ...; s'ils n'ont qu'une relation hostile, sortie Pas question.

Exemple d'entrée:
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
Exemple de sortie:
Pas de problème
OK
OK mais ...
pas moyen

une analyse:

La chose la plus gênante dans cette question est l'expression "un ami d'un ami est aussi un ami". Ce n'est pas clairement indiqué dans la question. En fait, c'est: «
Si l'ami d'un ami est un ennemi, ce n'est pas un ami»
Un ami d'un ami est l'ami d'un ami ... (tant qu'il ne l'est pas Les ennemis) sont tous amis,
donc ce n'est que lorsque ces deux règles sont respectées que nous pouvons utiliser la recherche combinée. Si ce n'est pas clair au début, cela sera fait comme une simulation ordinaire, donc c'est faux plusieurs fois.

Code:


#include <stdio.h>

using namespace std;

int father[107]; int Find(int a) {
    
    
	if (a != father[a])
		return father[a] = Find(father[a]);
	return a;
}

int main() {
    
    
	for (int i = 0; i<107; i++)
	{
    
    
		father[i] = i;
	}
	int n, m, k;
	bool en[107][107] = {
    
     0 };
	scanf("%d%d%d", &n, &m, &k);
	while (m--)
	{
    
    
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		if (c == 1)
		{
    
    
			int fa = Find(a);
			int fb = Find(b);
			if (fa != fb) father[fa] = fb;
		}
		else en[a][b] = en[b][a] = 1;
	}

	while (k--)
	{
    
    
		int a, b;
		scanf("%d%d", &a, &b);
		int fa = Find(a);
		int fb = Find(b);
		if (en[a][b])
		{
    
    
			if (fa == fb)puts("OK but...");
			else puts("No way");
		}
		else
		{
    
    
			if (fa == fb)puts("No problem");
			else puts("OK");
		}
	}
	return 0;
}


Je suppose que tu aimes

Origine blog.csdn.net/qq_43700916/article/details/88364245
conseillé
Classement