模板 图的遍历 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 }
深搜 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 }
以上是关于模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章