#美团笔试#
第三题我的解法:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<tuple>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
#include<map>
#include<unordered_map>
using namespace std;

vector<int>dfs(vector<int>a,vector<vector<int>>edge, int pre, int cur, int goal)
{
    if (cur == goal) return { cur };
    for (int i = 0; i < edge[cur].size(); i++)
    {
        int p = edge[cur][i];
        if (p == pre)continue;
        vector<int>sub = dfs(a, edge, cur, p, goal);
        if (sub.size() != 0)
        {
            sub.push_back(cur);
            return sub;
        }
    }
    return {};
}

int main()
{
    int n, m;
    cin >> n >> m;
    vector<int>a(n + 1);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    vector<vector<int>>edge(n + 1);
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    for (int i = 0; i < m; i++)
    {
        int x, u, v;
        cin >> x >> u >> v;
        if (x == 1)
        {
            vector<int>road = dfs(a, edge, 0, u, v);
            for (int i=0;i<road.size();i++)
            {
                int num = road[i];
                a[num] = a[num] ? 0 : 1;
            }
        }
        if (x == 2)
        {
            vector<int>road = dfs(a, edge, 0, u, v);
            int ans = 0;
            int flag = 1;
            for (int i = 0; i < road.size(); i++)
            {
                ans += a[road[i]] * flag;
                flag *= 2;
            }
            cout << ans << endl;
        }
    }
    return 0;
}
全部评论
差一点,时间不够了,我也用的dfs,我感觉可以把uv路径dfs完就缓存起来,这样一条路径查一次就好了
点赞 回复 分享
发布于 今天 07:55 江苏

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务