上进小青年

导航

图的遍历

深度搜索
 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 8
51 1 2 2
52 1 5 10
53 2 3 3
54 2 5 7
55 3 1 4
56 3 4 4
57 4 5 5
58 5 3 3
59 9
60 */
View Code

 

posted on 2016-09-16 14:01  上进小青年  阅读(139)  评论(0编辑  收藏  举报