首页 > 代码库 > 图的遍历
图的遍历
深度搜索
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int m,n,sum=0; 8 int ma[10][15]; 9 int vis[10];10 void dfs(int temp)11 {12 cout<<temp<<" ";13 sum++;14 vis[temp]=1;15 if(sum==n)return ;//当所有的店都遍历完成的时候直接退出16 for(int i=1;i<=n;i++){17 if(ma[temp][i]==1&&vis[i]==0)18 dfs(i);19 }20 21 }22 int main()23 {24 while(cin>>n>>m){25 memset(vis,0,sizeof(vis));26 //memset(ma,inf,sizeof(vis));27 for(int i=1;i<=n;i++){28 for(int j=1;j<=n;j++){29 if(i==j)ma[i][j]=0;30 else ma[i][j]=inf;31 }32 }33 int a,b,c;34 for(int i=0;i<m;i++){35 cin>>a>>b;36 ma[a][b]=ma[b][a]=1;//标记改点是可以连通的37 }38 vis[1]=1;39 dfs(1);//从1开始遍历40 }41 }
广度搜索
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 using namespace std; 7 const int inf=0x3f3f3f3f; 8 int m,n,sum=0; 9 int ma[10][15];10 int vis[10];11 12 int main()13 {14 while(cin>>n>>m)15 {16 queue<int>que;17 int temp,now;18 memset(vis,0,sizeof(vis));19 //memset(ma,inf,sizeof(vis));20 for(int i=1; i<=n; i++)21 {22 for(int j=1; j<=n; j++)23 {24 if(i==j)ma[i][j]=0;25 else ma[i][j]=inf;26 }27 }28 int a,b;29 for(int i=1; i<=m; i++)30 {31 cin>>a>>b;32 ma[a][b]=ma[b][a]=1;33 }34 que.push(1);35 int sum=0;36 while(!que.empty())37 {38 39 if(sum==n)break;40 sum++;41 cout<<que.front()<<" ";42 now=que.front();43 vis[now]=1;44 que.pop();45 for(int i=1; i<=n; i++)46 {47 if(ma[now][i]==1&&vis[i]==0)48 {49 que.push(i);50 }51 52 }53 }54 }55 }
给出n个点m条边,对于接下来的m行,每行输入a,b,c三个数字,代表可以从a走到b并且这段路程是c的长度,现在问你从1号城市到达5号城市要走的最短路程。
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int minn=0x3f3f3f3f; 8 int ma[1005][1005],vis[1005]; 9 int m,n,a,b,c;10 void dfs(int temp,int dis){11 12 if(dis>minn)return;13 if(temp==n)14 {if(dis<minn){15 minn=dis;16 return;17 }18 }19 for(int i=1;i<=n;i++){20 if(ma[temp][i]!=0x3f3f3f3f&&vis[i]==0){21 vis[i]=1;22 dfs(i,dis+ma[temp][i]);23 vis[i]=0;//****************这里非诚重要,当不可以再搜索的时候我们要退回来,就要去掉标记,因为再下一次的查找中可能还会用到这个点24 }25 }26 return ;27 }28 int main(){29 while(cin>>n>>m){30 memset(vis,0,sizeof(vis));31 for(int i=1;i<=n;i++)32 for(int j=1;j<=n;j++)33 {34 35 if(i==j)ma[i][j]=0;36 else ma[i][j]=inf;37 }38 for(int i=0;i<m;i++){39 cin>>a>>b>>c;40 ma[a][b]=c;41 }42 vis[1]=1;43 dfs(1,0);44 cout<<minn<<endl;45 //cout<<0x3f3f3f3f;46 }47 }48 49 /*50 5 851 1 2 252 1 5 1053 2 3 354 2 5 755 3 1 456 3 4 457 4 5 558 5 3 359 960 */
图的遍历
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。