A无向图的深度优先搜索
题目描述
已知一个无向图G的顶点和边,顶点从0依次编号,现在需要深度优先搜索,访问任一邻接顶点时编号小的顶点优先,请编程输出图G的深度优先搜索序列。
输入
第一行是整数m和n(1<m,n<100),分别代表顶点数和边数。后边n行,每行2个数,分别表示一个边的两个顶点。
输出
该图从0号顶点开始的深度优先搜索序列。
样例输入
5 5
0 1
2 0
1 3
1 4
4 2
样例输出
0 1 3 4 2
#include<iostream>
#include<queue>
using namespace std;
class Graph{
private:
int n;
int** edge;
public:
Graph(int n):n(n){
edge=new int*[n];
for(int i=0;i<n;i++){
edge[i]=new int[n];
for(int j=0;j<n;j++){
if(i==j) edge[i][j]=0;
else edge[i][j]=-1;
}
}
}
void insertEdge(int v1,int v2){
edge[v1][v2]=1;
edge[v2][v1]=1;
}
int getFirst(int v1){
for(int i=0;i<n;i++){
if(edge[v1][i]==1){
return i;
}
}
return -1;
}
int getNext(int v1,int v2){
for(int i=v2+1;i<n;i++){
if(edge[v1][i]==1){
return i;
}
}
return -1;
}
void DFS(int v,bool visited[]){
cout<<v<<" ";
visited[v]=true;
int w=getFirst(v);
while(w!=-1){
if(visited[w]==false) DFS(w,visited);
w=getNext(v,w);
}
}
void DFS(int v){
bool* visited=new bool[n];
for(int i=0;i<n;i++) visited[i]=false;
DFS(v,visited);
}
void BFS(int v){
bool* visited=new bool[n];
for(int i=0;i<n;i++) visited[i]=false;
cout<<v<<" ";
visited[v]=true;
queue<int> Q;
Q.push(v);
while(!Q.empty()){
v=Q.front();
Q.pop();
int w=getFirst(v);
while(w!=-1){
if(visited[w]==false){
cout<<w<<" ";
visited[w]=true;
Q.push(w);
}
w=getNext(v,w);
}
}
}
};
int main(){
int n,k;
cin>>n>>k;
Graph G(n);
int v1,v2;
for(int i=0;i<k;i++){
cin>>v1>>v2;
G.insertEdge(v1,v2);
}
G.DFS(0);
//G.BFS(0);
return 0;
}
B最小堆的形成
题目描述
现在给你n个结点的完全二叉树数组存储序列,请编程调整为最小堆,并输出相应最小堆的存储序列。
输入
第一行是n,第二行是n个结点的完全二叉树数组存储序列。
输出
输出相应最小堆的存储序列。
样例输入
8
53 17 78 23 45 65 87 9
样例输出
9 17 65 23 45 78 87 53
#include<iostream>
using namespace std;
void siftUp(int heap[], int start) {
int j = start;
int i = (j - 1) / 2;
int temp = heap[j];
while (j > 0) {
if (heap[i] <= temp) {
break;
} else {
heap[j] = heap[i];
j = i;
i = (i - 1) / 2;
}
}
heap[j] = temp;
}
int main() {
int n;
cin >> n;
int heap[n];
for (int i = 0; i < n; i++) {
cin >> heap[i];
siftUp(heap, i);
}
for (int i = 0; i < n; i++) {
cout << heap[i] << " ";
}
cout << endl;
return 0;
}
C折半查找的次数
题目描述
给你一个无重复数的有序序列,如果采用折半查找的方式,对于给定的数,需要比较几次找到,请编程实现。
输入
第一行是N,表示序列中数的个数,序列最长1000,第二行是一个有序序列,第三行是要找的数x。
输出
如果找到x,输出折半比较的次数,否则输出NO。
样例输入
11
5 13 19 21 37 56 64 75 80 88 92
19
样例输出
2
#include<iostream>
#include<cmath>
using namespace std;
void halfsearch(int arr[], int len, int index, bool flag) {
int count = 1;
int low = 0, high = len - 1, mid;
int tag = 0;
while ((low <= high) && tag == 0) {
mid = (low + high) / 2;
if (low == high - 1)
tag++;
if (index > arr[mid] && flag || index < arr[mid] && !flag) {
low = mid;
count++;
} else if (index < arr[mid] && flag || index > arr[mid] && !flag) {
high = mid;
count++;
} else {
cout << count << endl;
return;
}
}
cout << "NO" << endl;
return;
}
int main() {
int n;
cin >> n;
int* arr = new int[n];
int k;
for (int i = 0; i < n; i++) {
cin >> k;
arr[i] = k;
}
int m;
cin >> m;
halfsearch(arr, n, m, arr[n - 1] > arr[0]);
return 0;
}
D N个数的排序
题目描述
给你N个自然数,编程输出排序后的这N个数。
输入
第一行是整数的个数N(N<=100)。第二行是用空格隔开的N个数。
输出
排序输出N个数,每个数间用一个空格间隔。
样例输入
5
9 6 8 7 5
样例输出
5 6 7 8 9
#include <stdio.h>
int main() {
int n, a[100], i, j, temp;
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < n; i++) {
for (j = n - 1; j > i; j--) {
if (a[j] < a[j - 1]) {
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
printf("%d", a[0]);
for (i = 1; i < n; i++) {
printf(" %d", a[i]);
}
printf("\n");
}
return 0;
}
E班级同学信息查询
题目描述
班级里有N个同学,老师希望你编个程序,把每个同学的学号、姓名、座位号保存下来,然后每次要查同学信息时,直接输入相应同学的学号,即可输出该同学的姓名和座位号。
输入
第一行为整数N(N<100),表示班里同学的人数。接下来N行,每行分别是每个同学的学号、姓名和座位号,最后一行是要查询的同学的学号。
输出
输出查询同学的姓名和座位号。
样例输入
3
1 zhang 11
2 wang 22
3 li 33
2
样例输出
wang 22
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
unordered_map<string, pair<string, string>> students;
for (int i = 0; i < n; ++i) {
string id, name, seat;
cin >> id >> name >> seat;
students[id] = make_pair(name, seat);
}
string query;
cin >> query;
if (students.count(query)) {
cout << students[query].first << " " << students[query].second << endl;
}
return 0;
}