模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra

广搜 bfs

 1 //bfs
 2
 3 #include<iostream>
 4 #include<cstdio>
 5 using namespace std;
 6 int queue[1001],top=0,end=1;
 7 int map[1001][1001];
 8 int vis[1001];
 9 int n,m;
10 void bfs(int p)
11 {
12     queue[end]=p;
13     vis[p]=1;
14     printf("%c -->",queue[end]+64);
15     while(top!=end)
16     {
17         top++;
18         int k=queue[top];
19         for(int i=1;i<=n;i++)
20         {
21
22             if(vis[i]==0&&map[k][i]==1)
23             {
24                 printf("%c-->",i+64);
25                 queue[++end]=i;
26                 vis[i]=1;
27             }
28         }
29     }
30 }
31 int main()
32 {
33     char head,tail;
34     scanf("%d%d",&n,&m);
35     for(int i=1;i<=m;i++)
36     {
37         cin>>head>>tail;
38         head=head-64;
39         tail=tail-64;
40         map[head][tail]=map[tail][head]=1;
41     }
42     bfs(1);
43     return 0;
44 }

深搜 dfs

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 char maps[10][11];
 5 bool vis[1000];
 6 int q,m;
 7 void dfs(int a){
 8     vis[a]=1;
 9     if(a<q)
10     printf("%c --> ",a+64);
11      else printf("%c",a+64);
12     for(int i=1;i<=q;i++)
13     {
14         if(maps[a][i]==1&&vis[i]==0)
15         dfs(i);
16     }
17 }
18 int main()
19 {
20
21     char a,b;
22     cin>>q>>m;
23     for(int i=1;i<=m;i++)
24     {
25         cin>>a>>b;
26         maps[a-64][b-64]=1;
27         maps[b-64][a-64]=1;
28     }
29     dfs(1);
30 }

Floyed

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int maps[1001][1001];
 6 int ans;
 7 int main()
 8 {
 9     memset(maps,999999,sizeof(maps));
10     int n,m;
11     cin>>n>>m;
12     int he,ta,len;
13     for(int i=1;i<=m;i++)
14     {
15         cin>>he>>ta>>len;
16         maps[ta][he]=maps[he][ta]=len;
17     }
18     int x,y;
19     cin>>x>>y;
20     for(int k = 1;k <= n;k++)
21     for(int i = 1;i <= n;i++)
22     for(int j = 1;j <= n;j++)
23     {
24         if(maps[i][j]>maps[i][k]+maps[k][j])
25         maps[i][j]=maps[i][k]+maps[k][j];
26     }
27
28     printf("%d",maps[x][y]);
29 }

Dijkstra

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int n,m;
 7 const int maxn=9999999;
 8 int map[1001][1001],start,end;
 9 bool vis[1001];
10 int dis[1001],road[1001],minn,k;
11
12 void add(int now)
13 {
14        for(int i=1;i<=n;i++)
15     {
16         dis[i]=map[now][i];
17     }
18     vis[now]=true;
19     dis[now]=0;
20     for(int i=1;i<=n-1;i++)
21     {
22         minn=maxn;
23         k=now;
24         for(int j=1;j<=n;j++)
25         if(vis[j]==false&&dis[j]<minn)
26         {
27             minn=dis[j];
28             k=j;
29         }
30         vis[k]=true;
31         for(int g=1;g<=n;g++)
32         if(vis[g]==false&&dis[g]>dis[k]+map[k][g])
33         {
34             dis[g]=dis[k]+map[k][g];
35         }
36     }
37     printf("%d",dis[end]);
38     return ;
39
40 }
41 int main()
42 {
43     memset(map,maxn,sizeof(map));
44     memset(vis,false,sizeof(vis));
45     scanf("%d%d",&n,&m);
46     int he,ta,len;
47     for(int i=1;i<=m;i++)
48     {
49         scanf("%d%d%d",&he,&ta,&len);
50         map[ta][he]=map[he][ta]=len;
51     }
52     memset(dis,maxn,sizeof(dis));
53     cin>>start>>end;
54     add(start);
55     return 0;
56 }

时间: 2024-10-19 23:54:24

模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra的相关文章

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

图的遍历 (dfs与bfs)x

遍历是很多图论算法的基础,所谓图的遍历( graph traversal),也称为搜索( search),就是从图中某个顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次.         遍历可以采取两种方法进行:         深度优先搜索( DFS: depth first search):         广度优先搜索( BFS: breadth first search). 对图进行存储与遍历: 输入: 第一行:顶点数n. 第二行:边数m. 以下m行,每行两个顶点编号u

图的创建和遍历(BFS/DFS)

图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIndex; //该弧指向的顶点位置 struct ArcNode* next; //指向下一个弧 InfoType info; //该弧的相关信息,如权重等 }; struct Vertex { VertexType data; //顶点信息 ArcNode* firstArc; //指向第一条依附该

图的遍历——BFS

原创 裸一篇图的BFS遍历,直接来图: 简单介绍一下BFS遍历的过程: 以上图为例子,从0开始遍历,访问0,按大小顺序访问与0相邻的所有顶点,即先访问1,再访问2: 至此顶点0已经没有作用了,因为其本身和与其所有相邻的顶点都已被访问,将其出队列,我们用队列 存储已访问过的顶点:然后顺着队列,访问顶点1和所有与顶点1相邻的顶点,这里没有,所有访问顶点 2和所有与顶点2相邻的结点,即3和4,注意,是先访问3,再访问4,因为采用邻接矩阵来存储图. Java: import java.util.*; p

算法导论—无向图的遍历(BFS+DFS,MATLAB)

华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 无向图的遍历有两种方式-广度优先搜索(BFS)和深度优先搜索(DFS).广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了.然后遍历当前节点第一个相邻的节点的全部相邻节点,广度优先搜索使用队列来实现.深度优先搜索在遍历当前节点的全部相邻节点时,先对当前节点的第一个相邻节点进行訪

图的遍历 | 1131地铁图: dfs复杂模拟题

这题在搞清楚思路绕过坑后,还是可以写的出通过sample data的代码的.但是不能AC,让我很气. 最后查清原因:还是对dfs本质理解的不够. wa代码: vis[s]=1; dfs(s,e,0); 殊不知本题有多个查询数据.如果只调用一遍还可以蒙混过关,但是这样的错误必然导致wa ac代码: vis[s]=1;dfs(s,e,0);vis[s]=0; 参考柳诺博客修改的AC代码: #include <stdio.h> #include <memory.h> #include &

C#与数据结构--图的遍历

C#与数据结构--图的遍历 8.2 图的存储结构 图 的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区 中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多.常用的图的存储结构有邻接矩阵.邻接表.十字链表和邻接多重表. 8.2.1  邻接矩阵表示法 对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系.图8.10和图8.11中,矩阵A(i,j)=1

第五章 图的遍历(深度遍历,广度遍历,城市地图,最少转机)

深度和广度优先搜索: 单词分解:首先是搜索 深度和广度:是针对图的遍历而言的 图:由顶点和边组成 图的遍历:把图中每一个顶点都访问一次 一: 输入: 5 5(顶点数,边数) 1 2 1 3 1 5 2 4 3 5 输出: 1 2 4 3 5 (按时间戳输出)深度遍历 1 2 3 5 4 (按时间戳输出)广度遍历 1 #include <stdio.h> 2 int map[10][10], book[10], n, m,sum; 3 void dfs(int cur) 4 { 5 int i;

数据结构与算法10—图的遍历

图的遍历 1. 在图中有回路,从图中某一顶点出发访问图中其它顶点时,可能又会回到出发点,而图中可能还剩余有顶点没有访问到. 2. 我们可以设置一个全局型标志数组visited来标志某个顶点是否被访问过,未访问的值为0,访问过的值为1. 3. 图的遍历有两种方法:深度优先搜索遍历(DFS).广度优先搜索遍历(BFS). 深度优先搜索 深度优先搜索思想 首先访问顶点i,并将其访问标记置为访问过,即visited[i] =1: 然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的