• 图的遍历


    深度搜索
     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
    你若盛开,清风自来...
  • 相关阅读:
    Firefly多路人脸识别解决方案
    Jquery插件开发之图片放大镜效果(仿淘宝)
    html5 Game开发系列文章之 零[开篇]
    html5 Game开发系列文章之 一 精灵(上)
    html5 Game开发系列文章之 三 搭建基本游戏框架(代码封装)
    html5 Game开发系列文章之 二 精灵(下)
    JQEURY 插件之 简洁小提示框效果[ToolTips]
    18位身份证和组织机构代码校验ORACLE函数
    linux下apache+SVN搭建完美版
    MYSQL的常用命令和增删改查语句和数据类型
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5876374.html
Copyright © 2020-2023  润新知