浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第六讲)

浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第六讲)

在这里插入图片描述

编程说明
编程环境:平台运行
编程语言:C

第一题代码

这里借鉴自 https://www.cnblogs.com/yuxiaoba/p/8335758.html

#include <stdio.h>
#include <stdlib.h>

#define MAXN 10

typedef int Graph;
typedef int Vertex;
void BuildGraph();
void ListComponents(Graph G);
void Pre_DFS();
void DFS(Vertex V);
void BFS();

Graph G[MAXN][MAXN];
int Nv, Ne;
int visited[MAXN];

int main()
{
    BuildGraph();
    ListComponents(G);
    return 0;
}

void BuildGraph()
{
    int i, j, v1, v2;

    scanf("%d %d", &Nv, &Ne);
    /* CreateGraph */
    for (i=0; i<Nv; i++)
        for (j=0; j<Nv; j++)
            G[i][j] = 0; /* 或INFINITY */

    for (i=0; i<Ne; i++)
    {
        scanf("%d %d", &v1, &v2);
        /* InsertEdge */
        G[v1][v2] = 1;
        G[v2][v1] = 1;
    }
}

void ListComponents(Graph G)
{
    Pre_DFS();
    BFS();
}

void Pre_DFS()
{
    //Pre_DFS
    for(Vertex V=0;V<Nv;V++)
    {
        visited[V]=0;
    }

    for (Vertex V=0;V<Nv;V++)
    {
        if(!visited[V])
        {
            printf("{ ");
            DFS( V );
            printf("}\n");
        }
    }
}

void DFS(Vertex V)
{
    visited[V]=1;
    printf("%d ",V);
    for(Vertex W=0;W<Nv;W++)
    {
        if ((G[V][W]==1)&&(!visited[W]))
            DFS(W);
    }
}

void BFS()
{
    int Queue[MAXN]={0};  //用数组表示队列
    int rear=-1,front=-1;
    int temp;

    for(Vertex V=0;V<Nv;V++)
    {
        visited[V]=0;
    }

    for (Vertex V=0;V<Nv;V++)
    {
        if(!visited[V])
        {
            printf("{ ");
            visited[V]=1;
            Queue[++rear]=V;//入队
            while( front<rear )   //判断队列是否为空
            {
                temp=Queue[++front];
                printf("%d ",temp);
                for(Vertex W=0;W<Nv;W++)
                {
                    if(!visited[W] && G[temp][W])
                    {
                        visited[W]=1;
                        Queue[++rear]=W;
                    }
                }
            }
            printf("}\n");
        }
    }
}

C++程序源码

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

#define MAXN 10

int cnt = 0; // 连通量个数
vector<vector<int>> G(MAXN, vector<int>(MAXN, 0)); // 邻接矩阵
vector<vector<int>> res; // 最终连通集数组
vector<int> tmp; // 连通量
int N, E; // 节点数、边数
vector<int> vis(MAXN, 0); // 节点访问数组


void buildMatrix() {
    int n = E;
    while (n--) {
        int a, b;
        cin >> a >> b;
        G[a][b] = 1;
        G[b][a] = 1; 
    }
}

void dfs(int v) {
    vis[v] = 1;
    for (int w = 0; w < N; w++) {
        if (G[v][w] && vis[w] == 0) {
            tmp.emplace_back(w);
            dfs(w);
        }
    }
}

void preDfs() {
    for (int i = 0; i < N; i++) {
        if (vis[i] == 0) {
            tmp.emplace_back(i);
            dfs(i);
        }
        if (tmp.size() > 0) {
            res.emplace_back(tmp);
            cnt++;
            tmp.clear();
        }
    }
}

void bfs() {
    queue<int> q;
    for (int i = 0; i < N; i++) {
        vis[i] = 0;
    }

    for (int i = 0; i < N; i++) {
        if (vis[i] == 0) {
            q.emplace(i);
            vis[i] = 1;
            tmp.emplace_back(i);

            while (!q.empty()) {
                int v = q.front();
                q.pop();

                for (int w = 0; w < N; w++) {
                    if (G[v][w] && vis[w] == 0) {
                        q.emplace(w);
                        vis[w] = 1;
                        tmp.emplace_back(w);
                    }
                }
            }

            if (tmp.size() > 0) {
                res.emplace_back(tmp);
                cnt++;
                tmp.clear();
            }
        }
    }
}

void listComponents() {
    preDfs();
    bfs();
}

void print() {
    for (int i = 0; i < cnt; i++) {
        cout << "{ ";
        for (int j = 0; j < res[i].size(); j++) {
            cout << res[i][j] << " ";
        }
        cout << "}" << endl;
    }
}

int main() {
    cin >> N >> E;
    buildMatrix();
    listComponents();

    print();
    system("pause");
    return 0;
}

第二题代码:最小跳那个bug实在过不去,22分,求告知原因,谢谢

#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#define MAXN 20
typedef int Graph;
struct Node{
    int x;
    int y;
} GNode[MAXN];//每个节点用坐标结构体表示

void Data_scan(void);
double Distance(struct Node p,struct Node q);
void Save007(void);
int DFS(int V);

Graph G[MAXN][MAXN];//
int visited[MAXN];
int n;//鳄鱼数量
double d;//跳跃长度
double r=15.0/2;//起点圆盘半径;
int answer=0;

int main()
{
    Data_scan();
    Save007();
    return 0;
}

void Data_scan(void)
{
    //获取节点数和跳跃距离
    scanf("%d %lf",&n,&d);
    //初始点
    {
        GNode[0].x=0;
        GNode[0].y=0;
    }
    //获取每一个节点的坐标
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&GNode[i].x,&GNode[i].y);
    }
    //依据节点间距离更新邻接矩阵
    //用连接表更好,因为稀疏矩阵
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(i==j)
                G[i][j]=0;
            else
            {
                if(Distance(GNode[i],GNode[j])<= d)
                    G[i][j]=1;
                else
                    G[i][j]=0;
            }
            //printf("%d ",G[i][j]);
        }
        //printf("\n");
    }
}

double Distance(struct Node p,struct Node q)
{
    return sqrt(((p.x-q.x) * (p.x-q.x) + ((p.y-q.y) * (p.y-q.y))));
}

void Save007(void)
{
    int First_flag=0;
    visited[0]=1;
    for(int i=1;i<=n;i++)
    {
        visited[i]=0;
    }

    //以原点可连的连通域
    for(int i=1;i<=n;i++)
    {
        //小岛中心跳到第一条鳄鱼(每一条鳄鱼都可能是第一条)
        if((Distance(GNode[0],GNode[i])-r) <= d)
            First_flag=1;//可以跳上
        else
            First_flag=0;//跳不上

        if(!visited[i]&&First_flag)//此鳄鱼没有跳上过,并且第一次已经跳成功
        {
            answer = DFS(i);
            if(answer==1)
                break;
        }
    }
    if(answer==1)
        printf("Yes");
    else
        printf("No");
}

int DFS(int V)
{
    visited[V]=1;
    //终止条件
    if((GNode[V].x+d)>=50 || (GNode[V].y+d)>=50 || (GNode[V].x-d)<= -50 || (GNode[V].y-d)<= -50)
        answer=1;
    else
    {
        //递归条件
        for(int W=1;W<=n;W++)
        {
            if ((G[V][W]==1)&&(!visited[W]))
            {
                answer = DFS(W);
                if(answer) break;
            }
        }
    }
    return answer;
}

第三题代码

#include <stdio.h>
#include <stdlib.h>

#define MAXN 1001

typedef  int Graph_Matrix;
typedef  int Vertex;
void Data_Scan(void);
double BFS(Vertex V);

int N,M;//节点数、边数
Graph_Matrix G[MAXN][MAXN];//邻接矩阵
int Visited[MAXN]={0};
int count;
int Q[MAXN]={0};

int main()
{
    double Rate;
    Data_Scan();
    for(int i=0;i<N;i++)
    {
        Rate=BFS(i);
        printf("%d: %.2lf%%\n",i+1,Rate);
    }
    return 0;
}

void Data_Scan(void)
{
    //获取节点数N-边数M
    scanf("%d %d",&N,&M);
    //邻接矩阵赋值
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            G[i][j]=0;
    for(int k=0;k<M;k++)
    {
        int temp1,temp2;
        scanf("%d %d",&temp1,&temp2);
        G[temp1-1][temp2-1]=1;
        G[temp2-1][temp1-1]=1;
    }
}
//数组代替队列
double BFS(Vertex V)
{
    int front=0;//队首下标
    int rear=0;//队尾下标
    int last,tail,level;

    for(int i=0;i<N;i++)
    {
        Visited[i]=0;
        Q[i]=0;
    }

    Visited[V]=1;
    count=1;
    level=0;
    Q[rear++]=V;
    last=V;

    while(front<rear)
    {
        V=Q[front++];
        for(int W=0;W<N;W++)
        {
            if(G[V][W] && !Visited[W])
            {
                Visited[W]=1;
                Q[rear++]=W;
                count++;
                tail=W;
            }
        }
        if(V==last)
        {
            level++;
            last=tail;
        }
        if(level==6)
            break;
    }

    return count*100.0/N;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值