原文链接: PATA 题解
上一篇: Matlib例子
下一篇: 动态规划,数塔及其路径
A 1064
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1111;
//n是节点数,number用来存放节点权值,tree存放完全二叉树
//index从小到大枚举number数组
int n, number[MAXN], tree[MAXN], index = 0;
//中序遍历
void inOrder(int root) {
if (root > n) return;
inOrder(2 * root);
tree[root] = number[index++];
inOrder(2 * root + 1);
}
int main(int argc, char *argv[]) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", number + i);
sort(number, number + n);
inOrder(1);
for (int i = 1; i <= n; i++)
printf("%d%c", tree[i], i < n ? ' ' : '\n');
return 0;
}
A1099
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 111;
struct Node {
int data;
int left, right;
Node() {}
Node(int data, int right) :data(data), right(right) {}
};
Node tree[MAXN];
//n是节点个数,in是中序序列,num是已经填入,输出的节点个数
int n, in[MAXN], num = 0;
//中序遍历,将排序好的序列填入二叉树节点
void inOrder(int root) {
if (root == -1) return;
inOrder(tree[root].left);
tree[root].data = in[num++];
inOrder(tree[root].right);
}
void BFS(int root) {
queue<int> q;
q.push(root); //队列中存放的节点的在数组里的下标
int cnt = 0; //已经输出的节点个数
while (!q.empty()) {
int now = q.front();
q.pop();
cnt++;
printf("%d", tree[now].data);
if (cnt < n)
printf(" ");
if (tree[now].left != -1) q.push(tree[now].left);
if (tree[now].right != -1) q.push(tree[now].right);
}
}
int main(int argc, char *argv[]) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d %d", &tree[i].left, &tree[i].right);
for (int i = 0; i < n; i++)
scanf("%d", in + i);
sort(in, in + n);
inOrder(0);
BFS(0);
return 0;
}
A1013
dfs
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 1111;
vector<int> g[MAXN]; //邻接表
bool vis[MAXN]; //标记节点是否已被访问
int current; //当前需要删除的节点
void dfs(int v) {
if (v == current) return;
vis[v] = true;
//遍历所有v的邻接节点
for (int i = 0; i < g[v].size(); i++)
if (vis[g[v][i]] == false)
dfs(g[v][i]);
}
//顶点数,边数,查询数
int n, m, k;
int main(int argc, char *argv[]) {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
for (int query = 0; query < k; query++) {
scanf("%d", ¤t);
for (int i = 0; i < MAXN; i++)
vis[i] = 0;
int block = 0;
for (int i = 1; i <= n; i++)
if (i != current && vis[i] == false) {
dfs(i);
block++;
}
printf("%d\n", block - 1);
}
return 0;
}
并查集,路径压缩,否则超时
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 1111;
vector<int> g[MAXN];
int father[MAXN];
bool vis[MAXN];
int findFather(int x) {
int a = x;
while (x != father[x])
x = father[x];
//路径压缩
while (a != father[a]) {
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
//合并
void Union(int a, int b) {
int fa = findFather(a);
int fb = findFather(b);
if (fa != fb)
father[fa] = fb;
}
//初始化father数组和vis
void init() {
for (int i = 0; i < MAXN; i++) {
father[i] = i;
vis[i] = 0;
}
}
int main(int argc, char *argv[]) {
int n, m, k;
scanf("%d%d%d",&n,&m,&k);
for (int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
}
int current;
for (int query = 0; query < k; query++) {
scanf("%d", ¤t);
init();
for (int i = 1; i <= n; i++) {
for (int j = 0; j < g[i].size(); j++) {
int u = i, v = g[i][j];
if (u == current || v == current) continue;
Union(v, u);
}
}
int block = 0;
for (int i = 1; i <= n; i++) {
if (i == current) continue;
int fa_i = findFather(i);
if (vis[fa_i] == false) {
block++;
vis[fa_i] = true;
}
}
printf("%d\n", block - 1);
}
return 0;
}
A1076
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
//n个节点,最多m层
int n, m;
const int MAXN = 1111;
bool vis[MAXN];
struct Node {
int id, layer;
};
vector<Node> g[MAXN];
int bfs(int start) {
int cnt = 0;
queue<Node> q;
Node node;
node.id = start;
node.layer = 0;
vis[start] = true;
q.push(node);
while (!q.empty()) {
Node top = q.front();
q.pop();
int id = top.id;
for (int i = 0; i < g[id].size(); i++) {
Node next = g[id][i];
next.layer = top.layer + 1;
if (vis[next.id] == false && next.layer <= m) {
q.push(next);
vis[next.id] = true;
cnt++;
}
}
}
return cnt;
}
int main(int argc, char *argv[]) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
Node node;
node.id = i;
int k;
scanf("%d", &k);
for (int j = 0; j < k; j++) {
int t;
scanf("%d", &t);
g[t].push_back(node);
}
}
int start, num;
scanf("%d", &num);
for (int i = 0; i < num; i++) {
scanf("%d", &start);
for (int j = 0; j < MAXN; j++)
vis[j] = 0;
printf("%d\n", bfs(start));
}
return 0;
}