站外题BFS板子求调,悬赏2关,有注释
  • 板块学术版
  • 楼主Maysoul
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/4/12 16:19
  • 上次更新2023/10/23 18:41:45
查看原帖
站外题BFS板子求调,悬赏2关,有注释
409774
Maysoul楼主2023/4/12 16:19

已经在这个题上浪费了2.5h

球球大佬帮忙调一下吧

传送门

class Solution {
public:
    queue<int> q1;
    bool flag;//判断当前为蓝还是红
    bool vblue[400],vred[400];//记录该点是否走过,用于处理环
    int red(int goal,vector<vector<int>>& redEdges,vector<vector<int>>& blueEdges)//红开
    {
        for (int i=0;i<redEdges.size();i++)
        {
            if(redEdges[i][0]==0&&redEdges[i][1]!=0)//避免0 0自环
            {
                q1.push(redEdges[i][1]);
                vred[i]=1;
                flag=1;
            }
        }
        //cout<<bfs(goal,redEdges,blueEdges)<<endl;
        return bfs(goal,redEdges,blueEdges);
        
    }
    int blue(int goal,vector<vector<int>>& redEdges,vector<vector<int>>& blueEdges)//蓝开
    {
        for (int i=0;i<blueEdges.size();i++)
        {
            if(blueEdges[i][0]==0&&blueEdges[i][1]!=0)
            {
                q1.push(blueEdges[i][1]);
                vblue[i]=1;
                flag=0;
            }
        }
        return bfs(goal,redEdges,blueEdges);
        
    }
    int bfs(int goal,vector<vector<int>>& redEdges,vector<vector<int>>& blueEdges)
    {
        int step=0;
        while(!q1.empty())
        {
            int cnt=q1.size();
            step++;
            while(cnt--)
            {
                int cp=q1.front();
                //cout<<cp<<endl;   
                q1.pop();
                if(cp==goal)
                {
                    return step;
                }
                if(flag)
                {
                    for (int i=0;i<blueEdges.size();i++)
                    {
                        if(blueEdges[i][0]==cp&&vblue[i]==0)
                        {
                            q1.push(blueEdges[i][1]);
                            vblue[i]=1;
                        }
                    }
                    flag=0;
                }
                else
                {
                    for (int i=0;i<redEdges.size();i++)
                    {
                        if(redEdges[i][0]==cp&&vred[i]==0)
                        {
                            q1.push(redEdges[i][1]);
                            vred[i]=1;
                        }
                    }
                    flag=1;
                }
            }
        }
        return -1;
    }
    void sweep()//清空vred,vblue,弹出q1
    {
        while(!q1.empty())
        {
            q1.pop();
        }
        memset(vred,0,sizeof(vred));
        memset(vblue,0,sizeof(vblue));
    }
    vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& redEdges, vector<vector<int>>& blueEdges) {
        vector<int> answer;
        answer.resize(n);
        answer[0]=0;
        for (int i=1;i<n;i++)//枚举取每一个的最短路
        {
            int baka=red(i,redEdges,blueEdges);
            sweep();
            int hentai=blue(i,redEdges,blueEdges);
            sweep();
            //cout<<baka<<" "<<hentai<<endl;
            answer[i]=min(baka,hentai);//记录二者最小值
            if(answer[i]==-1)
            {
                if(baka>-1)
                {
                    answer[i]=baka;
                }
                if(hentai>-1)
                {
                    answer[i]=hentai;
                }
            }
            
            //cout<<answer[i]<<endl;
        }
        return answer;
    }
};
2023/4/12 16:19
加载中...