一(3)
注意事项
1、具体的画法,见下图即可
2、一定记住,书上下标从1开始,所以这里也都是从1开始
答案
二
思路
1、这种题就是典型的从某一点开始的层序遍历,一层一层的遍历,用visit数组防止多次访问,这样也能保证在这种题目要求之下,让路径最短
2、一次bfs能到的点,最短距离就是1,所以要啊最短距离是k,就k次层序遍历
3、一次动一层的节点
代码
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
void function_two() {
int n = 0;
cin >> n;
int num = 0;
cin >> num;
vector<vector<int>> edge(n + 1);
for (int i = 0; i < num; i++) {
int m = 0, n = 0;
cin >> m >> n;
edge[m].push_back(n);
edge[n].push_back(m);
}
bool visit[1000];
for (int i = 0; i < n + 1; i++) {
visit[i] = false;
}
//开始算法
int v = 0, k = 0;
cin >> v >> k;
queue<int> help;//辅助队列
help.push(v);
visit[v] = true;//辅助visit,防止重复访问
int level = 1;//该层节点数
while (!help.empty() && k > 0) {//边界,要么k给大了,提前就空了,要么因为k退出
int tmp_level = 0;//下一层节点数
for (int i = 0; i < level; i++) {
int tmp = help.front();
help.pop();
for (int e : edge[tmp]) {
if (!visit[e]) {//只继续访问没访问过的
help.push(e);
tmp_level++;
visit[e] = true;
}
}
}
k--;
level = tmp_level;
}
if (k != 0 || (help.empty() && k == 0)) {//失败
cout << "无目标节点";
}
while (!help.empty()) {
cout << help.front() << ' ';
help.pop();
}
return;
}
三
思路
代码
注意:
1、边界:k可能越界了,如果正着数,i!=k说明k太大,越界
2、边界:list是空
typedef struct node {
int data;
node* link;
}node;
int function_three(node* list, int k) {
if (list == nullptr) {//边界
return 0;
}
int i = 0;
node *item = list, *tmp = nullptr;//双指针法
for (item = list; item != nullptr; item = item->link) {
if (++i == k) {
tmp = item;//标记第二指针,辅助找到倒数第k个节点
break;
}
}
if (i != k) {
return 0;//说明给的k太大越界了
}
node* ans = nullptr;
for (item = list;; item = item->link, tmp = tmp->link) {//一起走,直到tmp后面是空
if (tmp->link == nullptr) {
ans = item;
break;
}
}
cout << ans->data;
return 1;
}