bfs
struct node {
int num;
int color;
node(int x, int y) :num(x), color(y){}
};
vector<int> shortestAlternatingPaths(int n, vector<vector<int>>& red_edges, vector<vector<int>>& blue_edges) {
vector<vector<int>> edges(n, vector<int> (n,0));//1红 2蓝 3红蓝
vector<vector<int>> already(n ,vector<int> (2, 0)); //already[i][0|1]=0|1 红|蓝,无|有
for (int i = 0; i < red_edges.size(); i++)
{
edges[red_edges[i][0]][red_edges[i][1]] += 1;
}
for (int i = 0; i < blue_edges.size(); i++)
{
edges[blue_edges[i][0]][blue_edges[i][1]] += 2;
}
queue<node> q;
q.push(node(0, 0));
int length = 1;
vector<int> res(n,-1);
res[0] = 0;
while (!q.empty())
{
int size = q.size();
while (size)
{
node head = q.front();
q.pop();
int hnum = head.num;
int hcolor = head.color;
for (int i = 0; i < n; i++)
{
if (edges[hnum][i] != 0)
{
if ((edges[hnum][i] == 1||edges[hnum][i]==3) && (hcolor == 0 || hcolor == 2) && already[i][0] == 0)
{
q.push(node(i, 1));
already[i][0] = 1;
if (res[i] == -1|| res[i]>length)
{
res[i] = length;
}
}
if ((edges[hnum][i] == 2 || edges[hnum][i] == 3) && (hcolor == 0 || hcolor == 1) && already[i][1] == 0)
{
q.push(node(i, 2));
already[i][1] = 1;
if (res[i] == -1 || res[i] > length)
{
res[i] = length;
}
}
}
}
size--;
}
length++;
}
return res;
}