数据结构作业3

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;  
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值