浙江大学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;
}