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

Posted Nico&11101001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 图的遍历 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 }
View Code

深搜 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 }
View Code

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 }
View Code

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 }
View Code

 

以上是关于模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

图的两种存储(邻接矩阵和邻接表)和两种遍历(DFS和BFS)

数据结构-图图的常用算法

最短路径——BFS算法

BFS - 20190206

图的最短路径

数据结构 -- 图的最短路径 Java版