关系推断
题目描述
给你一些已经确定的元素之间的关系,请你判断是否能从这些元素关系中推断出其他的元素关系。
输入
输入的第一行是一个整数N,表示测试数据的组数。
每组输入首先是一个正整数m(m<=100),表示给定元素关系的个数。
接下来m行,每行一个元素关系,格式为:
元素1<元素2 或者 元素1>元素2
元素用一个大写字母表示,输入中不会包含冲突的关系。
输出
对于每组输入,第一行输出“Case d:”,d是测试数据的序号,从1开始。
接下来输出所有推断出的新的元素关系,按照字典序从小到大排序,格式为:
元素1<元素2
每个元素关系占一行,输入中给定的元素关系不要输出。
如果没有新的元素关系推断出来,则输出NONE。
样例输入
2
3
A<B
C>B
C<D
2
A<B
C<D
样例输出
Case 1:
A<C
A<D
B<D
Case 2:
NONE
题意概括
给出两个字母之间的大小关系,然后推断这个字母和其他字母的大小关系;
解题思路
使用floyd算法讲所有的关系进行更新之后输出;
代码
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
int line [30][30];
int vis[30][30];
void floyd()
{
int i,j,k;
for(i=0;i<26;i++){
for(j=0;j<26;j++){
for(k=0;k<26;k++){
if(line[i][j]==0)
line[i][j]=line[i][k]&&line[k][j];
}
}
}
}
int main ()
{
int t,n,m,i,j;
char ch1,ch2,ch;
int l;
scanf("%d",&t);
l=0;
while(t--){
l++;
memset(vis,0,sizeof(vis));
memset(line,0,sizeof(line));
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf(" %c%c%c",&ch1,&ch,&ch2);
vis[ch1-'A'][ch2-'A']=i;
vis[ch2-'A'][ch1-'A']=i;
if(ch=='>')
line[ch1-'A'][ch2-'A']=1;
else line[ch2-'A'][ch1-'A']=1;
}
floyd();
printf("Case %d:\n",l);
/*for(i=0;i<26;i++){
for(j=0;j<26;j++){
printf("%d ",vis[i][j]);
}
printf("\n");
}*/
int num=0;
for(i=0;i<26;i++){
for(j=0;j<26;j++){
if(vis[i][j]!=0&&vis[j][i]==vis[i][j]){
continue;
}
if(line[j][i]){
printf("%c<%c\n",i+'A',j+'A');
num++;
}
}
}
if(num==0){
printf("NONE\n");
}
}
return 0;
}