关系推断

来源:互联网 发布:php7怎么配置apache 编辑:程序博客网 时间:2024/04/30 21:40

关系推断

题目描述

给你一些已经确定的元素之间的关系,请你判断是否能从这些元素关系中推断出其他的元素关系。

输入

输入的第一行是一个整数N,表示测试数据的组数。
每组输入首先是一个正整数m(m<=100),表示给定元素关系的个数。
接下来m行,每行一个元素关系,格式为:
元素1<元素2 或者 元素1>元素2
元素用一个大写字母表示,输入中不会包含冲突的关系。

输出

对于每组输入,第一行输出“Case d:”,d是测试数据的序号,从1开始。
接下来输出所有推断出的新的元素关系,按照字典序从小到大排序,格式为:
元素1<元素2
每个元素关系占一行,输入中给定的元素关系不要输出。
如果没有新的元素关系推断出来,则输出NONE。

样例输入

23A<BC>BC<D2A<BC<D

样例输出

Case 1:A<CA<DB<DCase 2:NONE

题意概括

给出两个字母之间的大小关系,然后推断这个字母和其他字母的大小关系;

解题思路

使用floyd算法讲所有的关系进行更新之后输出;

代码

#include<stdio.h>#include<string.h>#include<ctype.h>#include<math.h>#include<algorithm>#include<queue>#define inf 0x3f3f3f3fusing 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;}
原创粉丝点击