已经在这个题上浪费了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;
}
};