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; }