1129. 颜色交替的最短路径

百般思念 提交于 2019-12-01 10:19:21

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!