TOJ 3660 家庭关系

描述

给定若干家庭成员之间的关系,判断2个人是否属于同一家庭,即2个人之间均可以通过这些关系直接或者间接联系。

输入

输入数据有多组,每组数据的第一行为一个正整数n(1<=n<=100),表示有100个关系描述,接下来有n行,每行的描述方式为:
p1 p2 c
其中p1、p2和c均为一串文本,表示每个人的姓名,p1和p2为c的父亲和母亲。
最后一行包含2个字符串a和b,为待判断的两个人的姓名。
每个人的姓名由大小写字母组成,长度不超过80。

若n为0,表示输入结束。

输出

如果a和b在同一个家庭中,则输出Yes
否则输出No

样例输入

2
Barbara Bill Ted
Nancy Ted John
John Barbara
3
Lois Frank Jack
Florence Bill Fred
Annie Fred James
James Jack
0

样例输出

Yes
No


floyd传递闭包

写了好长时间,一直得不到正确答案,后来发现map没有清空~~~欲哭无泪!

#include <stdio.h>
#include <map>
#include <string>
#include <iostream>
#define MAXN 350
using namespace std;

int cnt;
int f[MAXN][MAXN];
map< string,int > M;

void floyd(){
	for(int k=1; k<cnt; k++){
		for(int i=1; i<cnt; i++){
			for(int j=1; j<cnt; j++){
				if( f[i][k] && f[k][j])
					f[i][j]=f[i][k] && f[k][j];
			}
		}
	}
}

void addedge(int u, int v){
	f[u][v]=1;
	f[v][u]=1;
}

void init(string fa, string ma, string ch, int& cnt){
	if(M[fa]==0)M[fa]=cnt++;
 	if(M[ma]==0)M[ma]=cnt++;
 	if(M[ch]==0)M[ch]=cnt++;
 	addedge(M[fa],M[ma]);
 	addedge(M[ma],M[ch]);
 	addedge(M[fa],M[ch]);
}
int main(int argc, char *argv[])
{
	int n;
	string a,b;
	while(scanf("%d",&n)!=EOF && n){
		M.clear();	
		memset(f,0,sizeof(f));
		cnt=1;
		for(int u=1; u<=n; u++){
			string fa,ma,ch;
			cin>>fa>>ma>>ch;
			init(fa,ma,ch,cnt);
		}
		
		floyd();
		cin>>a>>b;
		if(f[M[a]][M[b]]){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
		
	}
	return 0;
}
原文地址:https://www.cnblogs.com/chenjianxiang/p/3534757.html