#美团笔试#
第三题我的解法:
#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;
}
第三题我的解法:
#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完就缓存起来,这样一条路径查一次就好了
相关推荐
03-20 18:49
西北工业大学 Java 点赞 评论 收藏
分享
查看4道真题和解析