深搜,广搜

//实验要求:
//用邻接表存储一个无向图,
//深度优先,广度优先遍历
//拓扑排序
 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
typedef int status ;
struct ljno  //邻接表数据类型
{
	int x;  //存储数据
	ljno* next;
}ss;
struct ALGraph
{
	ljno *data ;
	int vexnum,exnum;//顶点个数和边的个数
};
status InitGraph(ALGraph &G)
{
	printf("请输入顶点的总个数:");
	scanf("%d",&G.vexnum);
	if((G.data=(ljno*)malloc(sizeof(ljno)*(G.vexnum+1)))==NULL)
	//下标为0的空间舍去不用
	exit(-1);
	for(int i=1;i<=G.vexnum;++i)
	G.data[i].x=i,G.data[i].next=NULL;
}
status insert(ALGraph &G,int a,int b) //将数据 b 插入第a 行 //升序插入
{
	ljno *p,*q,*t;
	q=&G.data[a];
	p=q->next;//	printf("----\n");
	while(p)
	{
		if(b==(p->x))
		break;
		else if(b<(p->x))
		{
			t=(ljno*)malloc(sizeof(ljno));
			if(NULL==t)
			exit(-1);
			q->next=t;
			t->x=b;
			t->next=p;
		}
		p=p->next;
		q=q->next;
	}
	if(NULL==p&&b!=q->x)
	{
		t=(ljno*)malloc(sizeof(ljno));
		if(NULL==t)
		exit(-1);
		q->next=t;
		t->x=b;
		t->next=p;
	}

}
status CreatGraph(ALGraph &G)  //创建邻接矩阵
{
	printf("请输入边的总条数:");
	scanf("%d",&G.exnum) ;
	for(int a,b,i=1;i<=G.exnum;++i)
	{
		scanf("%d%d",&a,&b);
		insert(G,a,b);
		insert(G,b,a);  // 无序图!!!
	}
}
void DFS(ALGraph G,int v,int visit[])  // 深度优先遍历
{
    ljno* p=&G.data[v];
    for(p=p->next;p;p=p->next)
    {
    	if(!visit[p->x])
        {
		    visit[p->x]=1;
	    	printf("->%d",p->x);
	    	DFS(G,p->x,visit);
    	}
    }
}
void DFSTraver(ALGraph G,int visit[])
{
	for(int i=1;i<=G.vexnum;++i)
	{
		if(!visit[i])
		{
			printf("->%d",i);
			visit[i]=1;
		}
		DFS(G,i,visit);
	}
	printf("\n");
}
struct  Queue
{
	int* base;
	int front;
	int real;    //指向队尾的上一个位置
}Q;
status initQueue(Queue &Q)
{
	Q.base=(int *)malloc(100*sizeof(int));
	if(!Q.base)
	{
		printf(" 内存分配失败,程序终止!\n");
		exit(-1);
	}
	Q.front=Q.real=0;
	return 1;
}
bool emptyQueue(Queue Q)
{
	if(Q.front==Q.real)
	return true;
	return false;
}
void Enqueue(Queue &Q,int v) // 入队
{
	//printf("入队元素为:%d\n",v);
	Q.base[Q.real]=v;
	Q.real++;
}
void Dequeue(Queue &Q,int &u)  //出队
{
	if(!emptyQueue(Q))
	{
		u=Q.base[Q.front];
		Q.front++;
	}
	//printf("删除元素为:%d\n",u);
}
void printqueue(Queue Q)
{
    int k=Q.front;
    printf("\n****************\n");
	while(k!=Q.real)
	{
	       printf("   %d",Q.base[k]);
	        k++;
	}printf("\n****************\n");
}
void BFS(ALGraph G,int v,int visit[],Queue &Q)  // 广度优先遍历
{
	int u;
	//initQueue(Q);  !!!!!!  出错位置
	ljno* p=&G.data[v];
	for(p=p->next;p;p=p->next)
	{
		if(!visit[p->x])
		{
			visit[p->x]=1;
			Enqueue(Q,p->x);
			//printqueue(Q) ;
			printf("->%d",p->x);
		}

	}	//vv(Q);
	while(!emptyQueue(Q))
	{
		Dequeue(Q,u);
		//printqueue(Q) ;
		BFS(G,u,visit,Q);
	}
}
void BFSTraver(ALGraph G,int visit[])
{
	for(int i=1;i<=G.vexnum;++i)
	{
		if(!visit[i])
		{
			visit[i]=1;
			printf("->%d",i);

		}
		initQueue (Q);
		BFS(G,i,visit,Q);
	}
	printf("\n");
}
/*void vi(ALGraph G)  //输出 邻接表
{
	for(int i=1;i<=G.exnum;++i)
	{
		ljno* p=&G.data[i];
		while(p)
		{
			printf("%d,",p->x);
			p=p->next;
		}
		printf("\n");
	}
}*/
int main()
{
	ALGraph G;
	InitGraph(G);
    int visit[100];
    memset(visit,0,sizeof(visit));
	CreatGraph(G);
    printf("深度优先搜索:\n");
    DFSTraver(G,visit);
    //vi(G);
    memset(visit,0,sizeof(visit));
    printf("广度优先搜索:\n") ;
    BFSTraver(G,visit);
	return 0;
}

时间: 2024-10-06 15:42:21

深搜,广搜的相关文章

HDU 4771 Stealing Harry Potter&#39;s Precious (深搜+广搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题面: 欢迎参加--BestCoder周年纪念赛(高质量题目+多重奖励) Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2207    Accepted Submis

leetcode 深搜广搜

遍历整个grid数组,当发现有1的时候,就把和这个1连成片的1都置为0,并增加一个计数.最后返回这个计数. 广搜,但这个代码通不过测试,栈溢出. class Solution { public: void bfs(vector<vector<char>>& grid,int i,int j){ if(i<0||j<0||i>=grid.size()||j>=grid[0].size()) return; if(grid[i][j]=='0') ret

迷宫问题(深搜 广搜)

题目描述: 给出一个m*n的迷宫图和一个入口,一个出口. 编一个程序,打印一条从迷宫入口到出口的路径. -1表示走不通,0表示能走,只能上下左右走: 无路可走输出"no way": 样例输入: 8 5-1 -1 -1 -1 -1 0 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -1-1 0 0 1 -1-1 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -12 18 4 8 5-1 -1 -1 -1 -10 0 0 0 -1-1 -1 -1 0 -1-1

7.23 深搜广搜

深搜(DFS)  关键词:回溯 栈实现,(递归本质和栈一样)一直走到底再回溯,时间复杂度高,空间低 #include<iostream> #include<cstring> using namespace std; int R,C; char maps[40][40]; int dp[40][40]; int dir[2][4]={{1,0,0,-1},{0,1,-1,0}}; int ans=1<<30; void DFS(int x,int y,int step){

DFS-BFS(深搜广搜)原理及C++代码实现

深搜和广搜是图很多算法的基础,很多图的算法都是从这两个算法中启发而来. 深搜简单地说就是直接一搜到底,然后再回溯,再一搜到底,一直如此循环到没有新的结点. 广搜简单地说就是一层一层的搜,像水的波纹一样往外面扩散,扩散到最外层搜索也就完成了. prim最小生成树.Dijkstra单源最短路径算法都使用了类似广度优先搜索的思想. 拓扑排序就可以用深搜来实现,分解强连通分量也可以用深搜来实现(转置图加两次深搜) 我们实现广搜时需要用队列来辅助我们进行.实现深搜时使用栈来辅助我们进行,所以显而易见的用递

图的创建,深搜,广搜(基于临接表实现)

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <queue> using namespace std; #define MaxVertexNum 100 //最大顶点数 typedef enum{DG,UDG,DN,UDN} GraphKind; //图的种类 typedef int InfoType; typedef char VertexType; typedef

965. 单值二叉树(深搜/广搜)

1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 private int val; 12 private boolean flag=true; 13 public b

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And

最短路问题------分别用深搜和广搜去解题

最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,1,0,0,1 1,1,0,1,0,0,0,0,1 1,1,1,1,1,1,1,1,1 0表示道路,1表示墙. 现在输入一个道路的坐标作为起点