NCNA 2017 E floyd传递闭包关系

floyd意识可以用来求解最短路的问题 但本身这个算法在实现过程中有实现权值传递的这么一个过程 所以floyd也可以用来实现传递关系的判断

这道题也是通过这个方法解决
所以以后在这种关系传递的问题上可以先往floyd上想一想靠一靠看看能否用flyod实现 关系可以这样传递 但是最终结果的判断还是根据不同的题目有差异的因此也并不全部一样

#include <bits/stdc++.h>

using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int N = 1e3+7;
int n,m,cnt,cas;// cnt代表着不同字符串的个数
map<string,int>mp;// 存放出现过得字符的位置 也就是序号
char gx[N];// 记录两个字符之间传递的关系
char a[N],b[N];// 记录第一个字符是什么 第二是什么
int is[N][N];
int has[N][N];// 分别记录下来两种可能的传递关系

void flyod()
{
    
    
    for(int i = 1;i <= cnt;i ++)
    {
    
    
        is[i][i] = 1;
    }
    for(int k = 1;k <= cnt;k ++)
    {
    
    
        for(int i = 1;i <= cnt;i ++)
        {
    
    
            for(int j = 1;j <= cnt;j ++)
            {
    
    
                if(is[i][k] && is[k][j])
                    is[i][j] = 1;
            }
        }
    }// is 关系的传递
    for(int k = 1;k <= cnt;k ++)
    {
    
    
        for(int i = 1;i <= cnt;i ++)
        {
    
    
            for(int j = 1;j <= cnt;j ++)
            {
    
    
                if(has[i][k]&&has[k][j])
                    has[i][j] = 1;
                if(is[i][k]&&has[k][j])
                    has[i][j] = 1;
                if(has[i][k]&&is[k][j])
                    has[i][j] = 1;
            }
        }
    }// has的传递关系为只要一条边即可传递
}

int main()
{
    
    
    cin>>n>>m;
    for(int i = 1;i <= n;i ++)
    {
    
    
        scanf("%s%s%s",a,gx,b);
        if(mp[a] == 0)
            mp[a] = ++cnt;
        if(mp[b] == 0)
            mp[b] = ++cnt;
        if(gx[0] == 'i')
            is[mp[a]][mp[b]] = 1;
        if(gx[0] == 'h')
            has[mp[a]][mp[b]] = 1;
    }
    flyod();
    for(int i = 1;i <= m;i ++)
    {
    
    
        scanf("%s%s%s",a,gx,b);
        if(mp[a] == 0)
            mp[a] = ++cnt;// 出现没有出现过得点就会被放到后面 这些点也一定 不会被传递到
        if(mp[b] == 0)
            mp[b] = ++cnt;
        if(gx[0] == 'i')
        {
    
    
            printf("Query %d: %s\n",i,is[mp[a]][mp[b]] == 1?"true":"false");
        }
        if(gx[0] == 'h')
        {
    
    
            printf("Query %d: %s\n",i,has[mp[a]][mp[b]] == 1?"true":"false");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45672411/article/details/104594448