• 关系推断


    关系推断

    题目描述

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

    输入

    输入的第一行是一个整数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:
    ",l);
            /*for(i=0;i<26;i++){
                for(j=0;j<26;j++){
                    printf("%d ",vis[i][j]);
                }
                printf("
    ");
            }*/
            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
    ",i+'A',j+'A');
                        num++;
                    }
                }
            }
            if(num==0){
                printf("NONE
    ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    ElasticSearch实战:Linux日志对接Kibana
    想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜
    详解CSS的Flex布局
    如何一步步在生产环境上部署django和vue
    Anisotropic Specular Shader
    Failed to install *.apk on device *: timeout
    logcat
    Android Debug Bridge
    DVI与VGA有什么区别
    Solo and Mute
  • 原文地址:https://www.cnblogs.com/lanaiwanqi/p/10445716.html
Copyright © 2020-2023  润新知