美文网首页
(未解决)L2_016愿天下有情人都是失散多年的兄妹(BFS)

(未解决)L2_016愿天下有情人都是失散多年的兄妹(BFS)

作者: 我好菜啊_ | 来源:发表于2018-03-30 22:04 被阅读0次
    • emmm一开始用的二位数组但100000*100000的二维数组太大了,就段错误了
      然后后来根据这道题目对bfs做修改,并不需要遍历所有点找与它相邻的点,只有去访问它的父亲和母亲就好,所以改成结构体的一位数组,然后段错误是没了(对了fstream如果没改掉的话,报的也是段错误),但是还是错了三个测试点。emmmmm。也不是父母性别没标的问题吧
      测试点1,3,4没过QAQ
      啊啊啊啊啊啊明天就要比赛了,我今晚又在这道题上磕了这么久= =
      总之明天加油!!
    #include <iostream>
    #include <queue>
    #include <cstring>
    #define N 100000
    using namespace std;
    int visited1[N]={0};
    int visited2[N]={0};
    int path[N];
    int sex[N];
    int have[N]={0};
    struct node
    {
        int id;
        int fid;
        int mid;
    };
    node nods[N];
    void BFS1(int start)
    {
        memset(visited1,0,sizeof(visited1));
        memset(path,N,sizeof(path));
        path[start]=0;
        queue<node> qn;
        qn.push(nods[start]);
        while(!qn.empty()){
            node v=qn.front();
            qn.pop();
            if(!visited1[v.id]){
                if(path[v.id]<5){
                    visited1[v.id]=1;
                    if(have[v.id]){
                        if(v.fid!=-1&&!visited1[v.fid]){
                          path[v.fid]=path[v.id]+1;
                          nods[v.fid].id=v.fid;
                          qn.push(nods[v.fid]);
                        }
                        if(v.mid!=-1&&!visited1[v.mid]){
                          path[v.mid]=path[v.id]+1;
                          nods[v.mid].id=v.mid;
                          qn.push(nods[v.mid]);
                        }
                    }
                }else{
                    break;
                }
            }
        }
    }
    void BFS2(int last)
    {
        int flag=0;//表示没有相同祖先
        memset(visited2,0,sizeof(visited2));
        memset(path,N,sizeof(path));
        path[last]=0;
        queue<node> qn;
        qn.push(nods[last]);
        while(!qn.empty()){
            node v=qn.front();
            qn.pop();
            if(!visited2[v.id]){
                if(path[v.id]<5){
                    if(visited1[v.id]){
                        flag=1;
                        break;
                    }
                    visited2[v.id]=1;
                    //cout<<v.id<<" "<<have[v.id]<<endl;
                    if(have[v.id]){
                        //我找了一晚上原来是因为这个地方携程visited1了所以不管是什么都输出yes==
                        if(v.fid!=-1&&!visited2[v.fid]){
                          path[v.fid]=path[v.id]+1;
                          nods[v.fid].id=v.fid;//注意没有出现在第一列的编号这个是没有初始化过的是0
                          qn.push(nods[v.fid]);
                        }
                        if(v.mid!=-1&&!visited2[v.mid]){
                          path[v.mid]=path[v.id]+1;
                          nods[v.mid].id=v.mid;
                          qn.push(nods[v.mid]);
                        }
                    }
                }else{
                    break;
                }
            }
        }
        if(flag)
            cout<<"No";
        else
            cout<<"Yes";
    }
    int main()
    {
    
        int n;cin>>n;
        for(int i=0;i<n;++i){
            int tid;char cs;int p1;int p2;
            cin>>tid>>cs>>p1>>p2;
            have[tid]=1;
            nods[tid].id=tid;
            nods[tid].fid=p1;
            nods[tid].mid=p2;
            if(cs=='M')
                sex[tid]=0;
            else
                sex[tid]=1;
            if(p1!=-1){
                sex[p1]=0;//父母的性别也要标记
            }
            if(p2!=-1){
                sex[p2]=1;
            }
        }
        int m;cin>>m;
        for(int i=0;i<m;++i){
            if(i)
               cout<<endl;
            int jh1,jh2;
            cin>>jh1>>jh2;
            if(sex[jh1]==sex[jh2])
                cout<<"Never Mind";
            else{
                BFS1(jh1);
                BFS2(jh2);
            }
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:(未解决)L2_016愿天下有情人都是失散多年的兄妹(BFS)

          本文链接:https://www.haomeiwen.com/subject/ldrwcftx.html