搜索专题
搜索
球队“食物链” (搜索+剪枝)
解题思路:
对于PAT的题目首先要先理解好题目。这里说了起点是1终点是N的一个哈密顿回路,因此我们在建好图之后,进行搜索即可,对于剪枝,因为最后一个点必须与1相连,因此对于该搜索到该节点,如果剩余的节点没有一个连向1,那么就可以返回。建图就是如果iWj,那么i有一条指向j的边,如果为L,则j指向i。
注意点:
要四舍五入后不是0,则范围在:大于等于0.05(四舍五入0.1),或小于等于-0.05(四舍五入-0.1)。即绝对值要大于0.05
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 24;
int n ;
int g[N][N];
char str[N];
int p[N] ;
bool flag, st[N];
void dfs(int u, int t) {
if (flag)
return ;
if (t == n + 1 && g[u][1] ) {
flag = 1;
return ;
}
int k ;
for (k = 1; k <= n ; ++k)
if (!st[k] && g[k][1])
break;
if (k == n + 1)
return ;
for (int i = 1 ; i <= n; ++i) {
if (!st[i] && g[u][i] && !flag ) {
p[t] = i;
st[i] = 1;
dfs(i, t + 1);
st[i] = 0;
}
}
}
int main() {
cin >> n;
for (int i = 1 ; i <= n ; ++i) {
scanf("%s", str);
for (int j = 1 ; j <= n ; ++j) {
char ch = str[j - 1];
if (ch == 'W')
g[i][j] = 1;
else if (ch == 'L')
g[j][i] = 1;
}
}
p[1] = 1, st[1] = 1;
dfs(1, 2);
if (flag)
for (int i = 1 ; i <= n ; ++i)
if (i != n)
cout << p[i] << ' ';
else
cout << p[i] << endl;
else
cout << "No Solution\n";
return 0;
}
愿天下有情人都是失散多年的兄妹(搜索+公共祖先)
解题思路
我们将关系进行建树(用邻接表来存)后,只要在搜索的时候,出现当后面搜索的那个人,有一个存在的关系节点,被访问过了就说明它们两个之间在五代之内存在关系。
注意事项
需要将父母的性别也记录下来,不然有几个点过不去。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
vector<int>g[N];
int n, m;
char sex[N];
bool st[N], key;
void dfs(int u, int h) {
st[u] = 1;
if (h >= 4)
return ;
for (int i = 0 ; i < g[u].size() ; ++i) {
int x = g[u][i];
if (!st[x])
dfs(x, h + 1);
else
key = 1;
}
}
int main() {
cin >> n ;
for (int i = 1; i <= n ; ++i) {
int a, b, c;
char x;
cin >> a >> x >> b >> c;
sex[a] = x;
if (b != -1)
g[a].push_back(b) ,sex[b] = 'M';
if (c != -1)
g[a].push_back(c) ,sex[c] = 'F';
}
cin >> m;
while (m--) {
int a, b;
cin >> a >> b;
if (sex[a] == sex[b])
cout << "Never Mind\n";
else {
key = false;
memset(st, 0, sizeof st);
dfs(a, 0);
dfs(b, 0);
if (key)
cout << "No\n";
else
cout << "Yes\n";
}
}
return 0;
}
功夫传人
解题思路
这题就是依据关系建好图之后在图上跑一遍dfs。注意的是只是求得道者的功力总和。
代码:
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
vector<int>g[N]; //邻接表存图
int n ;
double Z, r, power[N] , ans;
bool st[N] ;
void dfs(int u, double val) {
if (power[u]) {
ans += val * power[u];
st[u] = 1;
return ;
}
st[u] = 1;
for (int i = 0 ; i < (int)g

最低0.47元/天 解锁文章
279

被折叠的 条评论
为什么被折叠?



