图中指定两点间的最短距离

来源:互联网 发布:中国电信it研发中心 编辑:程序博客网 时间:2024/05/02 05:03

知识点:

1、针对vector<char>类型的遍历

Vector<char> vec;

For(char ch: vec) {//ch就是vec中存储的值}   若vec为空,不会进入循环

2、对于递归函数,可以巧用静态变量。递归函数会反复调用自身,反复从函数的头部执行,普通变量会被重复创建,无法在迭代过程中共享;静态变量只会在第一次运行时赋值,可以用作在多个迭代过程中的数据共享,函数体会多次调用,但使用的静态变量是同一个。

3、常规方法不能使递归在想退出的地方立刻退出,return只能使函数结束当前层次的此次调用,不能避免递归函数的逐步返回也不能阻止递归函数进入其他支线的递归。可以通过一个额外的静态或者全局变量控制递归,阻止其继续递归下去。在递归的开始处对改变量进行判断,在想退出的地方对该变量赋值。递归的逐步返回是没法避免的。

4、DFS深度优先遍历

题目:

定义一个关系对集合S = {(A,B),(B,J),(C,D),(E,F),(G,H),(H,I),(I,J)},每一个关系对之间的关系可以是同事,同学,老乡等。关系间的距离可以定义为到达对方所需的最小步数,即AB之间距离为1,AJ之间距离为2.请写一个函数,实现如下功能:给定两个人x和y,一个数字d,判断这两个人在距离d内存不存在关系。 
输入输出示例: 
A I 2 => false 
A I 3 => true

代码:

#include<iostream>#include<vector>using namespace std;bool contain(vector<char> vec, char b){for (char ch : vec)    //需要掌握的一种遍历方式,对待string也是适用的{if (ch == b) return true;}return false;}//图论部分,用vector建立邻接表,建立图的时候注意,图是有向的,还是无向的typedef struct     //图中边的结构,对于给定的节点,一个节点就可以表示一条边{vector<char> to;void addedge(char a){if (!contain(to, a)){to.push_back(a);}}}edge;void dfs(vector<edge> vec, char s, char e, int d, bool &res){static int num = 0;static bool flag = false;static vector<bool> vist(26, false);   //深度优先遍历时需要的标志数组,用于判断该节点是否已经访问过了//深度遍历无关项if ((s == e) && (num <= d)){res = true;flag = true;}if (num >d){res = false;flag = true;}if (flag) return;//深度遍历无关项vist[s - 'A'] = true;num++;if (vec[s - 'A'].to.size() == 0) return;for (char ch : vec[s - 'A'].to){if (vist[ch - 'A'] == false){dfs(vec, ch, e, d, res);}}}int main(){ char input[7][2] = { { 'A', 'B' }, { 'B', 'J' }, { 'C', 'D' }, { 'E', 'F' }, { 'G', 'H' }, { 'H', 'I' }, { 'I', 'J' } }; vector<edge> a(26); for (int i = 0; i < 7; i++){ a[(input[i][0] - 'A')].addedge(input[i][1]); a[(input[i][1] - 'A')].addedge(input[i][0]); }bool res = false; vector<bool> vist(26, false); dfs(a, 'A', 'I', 2, res); cout << res << endl; return 0; }
#include<iostream>#include<vector>using namespace std;bool contain(vector<char> vec, char b){for (char ch : vec){if (ch == b) return true;}return false;}typedef struct{vector<char> to;void addtable(char a){if (!contain(to, a)){to.push_back(a);}}}table;void dfs(vector<table> vec, char s){static vector<bool> vist(26, false);if (vist[s - 'A']) return;if (vec[s - 'A'].to.size() == 0) return;vist[s - 'A'] = true;cout << s << endl;for (char ch : vec[s - 'A'].to){if (vist[ch - 'A'] == false){dfs(vec, ch);}}}void gsearch(vector<table> vec){int len = vec.size();for (int i = 0; i < len; i++){dfs(vec, 'A' + i);}}int main(){char input[7][2] = { { 'A', 'B' }, { 'B', 'J' }, { 'C', 'D' }, { 'E', 'F' }, { 'G', 'H' }, { 'H', 'I' }, { 'I', 'J' } };vector<table> a(26);for (int i = 0; i < 7; i++){a[(input[i][0] - 'A')].addtable(input[i][1]);a[(input[i][1] - 'A')].addtable(input[i][0]);}gsearch(a);system("pause");return 0;}



原创粉丝点击