首页 > 代码库 > 图的遍历

图的遍历

深度搜索
技术分享
 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 }
View Code

 广度搜索

技术分享
 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 }
View Code

 给出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 */
View Code

 

图的遍历