题目描述
解题思路
该题是一道图论问题,目的是寻找最短路径下能采购到的零食总数,故先利用矩阵生成无向连通图,再采用深度优先遍历,存储两点之间的所有路径,再判断哪条最短路径,在最短路径下模拟零食采购,用集合存储零食种类,集合大小即为所求零食种类数
附代码+注释
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
using namespace std;
int N, q;
vector<int> type;
vector<int> temp;
void dfs(int b, int e,vector<vector<int>>& line,vector<vector<int>> matrix,int length) {
if (b == e) { line.push_back(temp); return; }
if (length > N) return;
for (int i = 0; i < matrix[b].size();i++) {
if (matrix[b][i] == 1) {
temp.push_back(i); //将当前节点加入路径中
dfs(i, e, line, matrix,length+1);
temp.pop_back();
}
}
return;
}
int main() {
cin >> N >> q;
vector<int> t(N, 0);
vector<vector<int>> matrix(N, t);
int n = N;
while (n--) {
int temp;
cin >> temp;
type.push_back(temp);
}
n = N - 1;
while (n--) {
int i, j;
cin >> i >> j;
matrix[i - 1][j - 1] = 1;
matrix[j - 1][i - 1] = 1; //生成无向连通图
}
while (q--) {
int begin0, end0;
cin >> begin0 >> end0;
vector<vector<int>> line;
dfs(begin0 - 1, end0 - 1, line,matrix,0);
int minlength = line[0].size();
int f = 0;
for (int i = 0; i < line.size(); i++)
{
if (line[i].size() < minlength) {
f = i;
minlength = line[i].size(); //寻找最短路径
}
}
set<int> s;
s.insert(type[begin0 - 1]);
for (auto x : line[f]) {
s.insert(type[x]); //模拟零食采购
}
cout << s.size();
}
return 0;
}