• hdu 4096 判断路径


    思路:将每个关系当成一条有向边,查询时就判断之间存在路径。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<string>
    #include<map>
    #define Maxn 210
    using namespace std;
    map<string,int> g;
    map<string,int> ver;
    int head[Maxn*2],vi[Maxn*2],e;
    struct Edge{
        int u,v,next;
    }edge[Maxn*Maxn*2];
    void add(int u,int v){
        edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
    }
    bool dfs(int u,int x)
    {
        int i,v;
        vi[u]=1;
        if(u==x)
            return true;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(vi[v]) continue;
            if(dfs(v,x))
               return true;
        }
        return false;
    }
    int main()
    {
        char str[101001],s1[Maxn],s2[Maxn],s3[Maxn],s4[Maxn],s5[Maxn],s6[Maxn];
        int cnt,num,i,j,t,Ca=0,u,v;
        scanf("%d",&t);
        getchar();
        while(t--){
            cnt=0;
            memset(vi,0,sizeof(vi));
            memset(head,-1,sizeof(head));
            e=0;
            g.clear();
            ver.clear();
            printf("Case #%d:
    ",++Ca);
            while(cin.getline(str,2000,'
    ')){
                int l=strlen(str);
                if(str[l-1]=='!'){
                    printf("
    ");
                    break;
                }
                num=sscanf(str,"%s %s %s %s %s %s",s1,s2,s3,s4,s5,s6);
                if(num==3){
                    l=strlen(s3);
                    if(s3[l-1]=='.'){
                        s3[l-1]='';
                        if(s2[0]=='a'){
                            if(!g[s1]) g[s1]=++cnt;
                            if(!g[s3]) g[s3]=++cnt;
                            u=g[s1];
                            v=g[s3];
                        }else{
                            if(!g[s1]) g[s1]=++cnt;
                            if(!ver[s3]) ver[s3]=++cnt;
                            u=g[s1];
                            v=ver[s3];
                        }
                        add(u,v);
                    }
                    else{
                        s3[l-1]='';
                        if(!g[s2]) g[s2]=++cnt;
                        u=g[s2];
                        if(s1[0]=='a'){
                            if(!g[s3]) g[s3]=++cnt;
                            v=g[s3];
                        }
                        else{
                            if(!ver[s3]) ver[s3]=++cnt;
                            v=ver[s3];
                        }
                        memset(vi,0,sizeof(vi));
                        if(dfs(u,v)){
                            printf("Y");
                        }else {
                            printf("M");
                        }
                    }
                }
                else{
                    l=strlen(s6);
                    if(s6[l-1]=='.'){
                        s6[l-1]='';
                        if(s5[0]=='a'){
                            if(!ver[s4]) ver[s4]=++cnt;
                            if(!g[s6]) g[s6]=++cnt;
                            u=ver[s4];
                            v=g[s6];
                        }else{
                            if(!ver[s4]) ver[s4]=++cnt;
                            if(!ver[s6]) ver[s6]=++cnt;
                            u=ver[s4];
                            v=ver[s6];
                        }
                        add(u,v);
                    }
                    else{
                        s6[l-1]='';
                        if(s1[0]=='c'){
                            if(!ver[s5]) ver[s5]=++cnt;
                            if(!ver[s6]) ver[s6]=++cnt;
                            u=ver[s5];
                            v=ver[s6];
                        }
                        else {
                            if(!ver[s5]) ver[s5]=++cnt;
                            if(!g[s6]) g[s6]=++cnt;
                            u=ver[s5];
                            v=g[s6];
                        }
                        memset(vi,0,sizeof(vi));
                        if(dfs(u,v)){
                            printf("Y");
                        }else {
                            printf("M");
                        }
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    JMeter参数签名——Groovy工具类形式
    arthas进阶thread命令视频演示
    疫情期间,如何提高远程办公效率
    Groovy中的闭包
    arthas快速入门视频演示
    绑定手机号性能测试
    基于HTTP请求的多线程实现类--视频讲解
    合格的测试经理必备技能
    Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My
    Navicat Premium怎么设置字段的唯一性(UNIQUE)?
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3366699.html
Copyright © 2020-2023  润新知