数据结构上机题目--搜索
2013-10-28 16:36
645 查看
BFS邻接表。
BFS邻接矩阵
dfs邻接表
dfs邻接矩阵
/************************************************************************* * author:crazy_石头 * algorithm:bfs * date:2013/09/29 * 程序功能:bfs一个图 **************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <time.h> #include <queue> #include <algorithm> using namespace std; #define A system("pause") #define N 100005 #define M 400010 #define INF INT_MAX const int maxn=1000; int head[maxn],vis[maxn]; int n,e;//顶点数,边数; int cnt; struct Edge { int to; int next; int cost; }edge[maxn*maxn]; inline void addedge(int u,int v,int cost) { edge[cnt].to=v; edge[cnt].next=head[u]; edge[cnt].cost=cost; head[u]=cnt++; } inline void makemap(int u,int v,int cost) { addedge(u,v,cost); addedge(v,u,cost); } inline void BFS(int s) { queue<int> q; q.push(s); vis[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(!vis[v]) { vis[v]=1; printf("当前访问到的结点为:%d\n",v); q.push(v); } } } } inline void init() { memset(head,-1,sizeof(head)); cnt=0; } int main() { memset(vis,0,sizeof(vis)); cin>>n>>e; init(); while(e--) { int a,b,cost; cin>>a>>b>>cost; makemap(a,b,cost); } printf("当前访问的顶点为:%d\n",0); BFS(0); return 0; } /* 6 9 0 1 20 0 2 16 1 4 13 1 2 15 1 5 28 5 4 12 4 3 12 2 3 14 5 3 12 0 2 1 3 5 4 */
BFS邻接矩阵
/************************************************************************* * author:crazy_石头 * algorithm:bfs * date:2013/09/29 * 程序功能:bfs一个图 **************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <time.h> #include <queue> #include <algorithm> using namespace std; #define A system("pause") #define N 100005 #define M 400010 #define INF INT_MAX const int maxn=1000; int vis[maxn]; int map[maxn][maxn],a[maxn][maxn]; int n,e;//顶点数,边数; inline void makemap() { cin>>n>>e; memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; a[i][j]?map[i][j]=1:map[i][j]=0;//建图; } } } inline void BFS(int s) { queue<int> q; q.push(s); vis[s]=1; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=1;i<=n;i++) { if(map[x][i]) { if(!vis[i]) { vis[i]=1; printf("当前访问到的结点为:%d\n",i); q.push(i); } } } } } int main() { memset(vis,0,sizeof(vis)); makemap(); //printf("当前访问到的结点为:%d\n",1); //BFS(1); for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; printf("当前访问到的顶点为:%d\n",i); BFS(i);//存在未BFS到的点,则从未访问的点开始BFS,此时i是起点。 } } return 0; } /* 7 12 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 3 2 6 4 5 7 */
dfs邻接表
/************************************************************************* * author:crazy_石头 * algorithm:dfs * date:2013/09/29 * 程序功能:dfs一个图 **************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <time.h> #include <algorithm> using namespace std; #define A system("pause") #define N 100005 #define M 400010 #define INF INT_MAX const int maxn=1000; int head[maxn],vis[maxn]; int n,e;//顶点数,边数; int cnt; struct Edge { int to; int next; int cost; }edge[maxn*maxn]; inline void addedge(int u,int v,int cost) { edge[cnt].to=v; edge[cnt].next=head[u]; edge[cnt].cost=cost; head[u]=cnt++; } inline void makemap(int u,int v,int cost) { addedge(u,v,cost); addedge(v,u,cost); } inline void dfs(int u) { for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(!vis[v]) { vis[v]=1; printf("当前访问的顶点为:%d\n",v); dfs(v); } } } inline void init() { memset(head,-1,sizeof(head)); cnt=0; } int main() { memset(vis,0,sizeof(vis)); cin>>n>>e; init(); while(e--) { int a,b,cost; cin>>a>>b>>cost; makemap(a,b,cost); } printf("当前访问的顶点为:%d\n",0); vis[0]=1; dfs(0);//图是联通的,从0开始可以一遍dfs完,当然也可以和前面一样,找出未被访问的点dfs。 return 0; } /* 6 9 0 1 20 0 2 16 1 4 13 1 2 15 1 5 28 5 4 12 4 3 12 2 3 14 5 3 12 0 2 3 5 4 1 */
dfs邻接矩阵
/************************************************************************* * author:crazy_石头 * algorithm:dfs * date:2013/09/29 * 程序功能:dfs一个图 **************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <time.h> #include <algorithm> using namespace std; #define A system("pause") #define N 100005 #define M 400010 #define INF INT_MAX const int maxn=1000; int a[maxn][maxn],map[maxn][maxn]; bool vis[maxn]; int n,e;//顶点数,边数; inline void dfs(int s) { for(int i=1;i<=n;i++) { if(map[s][i]) { if(!vis[i]) { vis[i]=1; printf("当前访问的顶点为:%d\n",i); dfs(i); } } } } int main() { cin>>n>>e; memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); a[i][j]?map[i][j]=1:map[i][j]=0;//建图; } } memset(vis,0,sizeof(vis)); //printf("当前访问的顶点为:%d\n",1); //vis[1]=1; //dfs(1);//完成一次由1开始的dfs。 for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; printf("当前访问的顶点为:%d\n",i); dfs(i);//存在为dfs到的点,则从未访问的点开始dfs。 } } return 0; } /* 7 12 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 3 2 6 4 5 7 */
相关文章推荐
- 数据结构上机题目--离散时间模拟(银行等待问题)
- 数据结构上机题目4--后缀表达式求值
- 数据结构上机题目3--学生信息排序
- 数据结构上机题目2--快排
- 数据结构上机题目1--基本排序
- 分区表是硬盘的重要数据结构,管理整个硬盘空间
- 【数据结构】第1周 线性表 4:放苹果
- 【数据结构】第1周 线性表 3:位查询
- 【数据结构】第1周 线性表 2:字符串插入
- 【数据结构】第1周 线性表 1:多项式加法
- 数据结构复习纲要
- 数据结构(java)_数组顺序查找
- 用java源代码学数据结构<四>: LinkedList 详解
- 数据结构与算法实验题6.1 鼹鼠掘土挑战赛
- 判断循环队列是满还是空
- NameNode和DataNode中重要的数据结构解析
- 2013hpuacm第八周周赛题
- 大话数据结构十二:字符串的模式匹配(BM算法)
- 数据结构-单链表排序遇到的一个问题
- 数据结构