• 第六章部分例题


    Ideal Path  不熟悉父节点方式

    自己先敲了一遍

    1.发现需要vis数组来进行mark

    2.无论是push过程还是pop过程发现目标节点都可以开始打印,但是push过程如果有多个parent节点会有错误.

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue>
     4 #include <vector>
     5 
     6 using namespace std;
     7 
     8 const int maxn=1000;
     9 
    10 int G[maxn][maxn];
    11 int p[maxn];
    12 int vis[maxn];
    13 int n;
    14 int m;
    15 queue<int> q;
    16 vector<int> v;
    17 
    18 void init()
    19 {
    20     for(int i=0;i<m;i++)
    21     {
    22         int l1,l2,rgb;
    23         cin>>l1>>l2>>rgb;
    24 
    25         G[l1][l2]=G[l2][l1]=rgb;
    26     }
    27 }
    28 
    29 void print_ans(int i)
    30 {
    31     v.clear();
    32 
    33     while(i!=1)
    34     {
    35         v.push_back(i);
    36 
    37         i=p[i];
    38     }
    39 
    40     printf("1 ");
    41     for(int  i=v.size()-1;i>=0;i--)
    42         if(i==v.size()-1) printf("%d",v[i]);
    43         else printf(" %d",v[i]);
    44 
    45     printf("
    ");
    46 }
    47 
    48 void bfs(int i)
    49 {
    50     q.push(1);
    51     vis[1]=1;
    52 
    53     while(!q.empty())
    54     {
    55         int node=q.front();
    56         q.pop();
    57 
    58         for(int j=1;j<=n;j++)
    59         {
    60             if(G[node][j]>0) 
    61                 if(!vis[j])
    62                 {
    63                     q.push(j);
    64                     p[j]=node;
    65                     vis[j]=1;
    66 
    67                //找到最先连接目标点的路径即为最短路径???
    68                     if(j==i)
    69                     {
    70                         print_ans(i);
    71                         return;
    72                     }
    73                 }
    74         }
    75     }
    76 }
    77 
    78 
    79 
    80 int main()
    81 {
    82     cin>>n;
    83     cin>>m;
    84 
    85     int i;
    86     cin>>i;
    87 
    88     init();
    89 
    90     bfs(i);
    91 
    92     return 0;
    93 }

    不记录父节点的bfs

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <map>
    
    using namespace std;
    
    const int maxn=10000;
    const int inf=1000000;
    int G[maxn][maxn];
    int d[maxn];
    int vis[maxn];
    queue<int> q;
    map<int,int> ma;
    int m,n;
    
    void init()
    {
        for(int i=0;i<m;i++)
        {
            int l1,l2;
            cin>>l1>>l2;
    
            //cout<<l1<<" "<<l2<<endl;
    
            G[l1][l2]=G[l2][l1]=1;
        }
    }
    
    void bfs(int dst)
    {
        memset(d,inf,sizeof(d));
    
        q.push(dst);
        vis[dst]=1;
        d[dst]=0;
    
    
        while(!q.empty())
        {
            int node=q.front();
            q.pop();
    
            for(int i=1;i<=n;i++)
                if(G[node][i]>0)
                    if(!vis[i])
                    {
                        d[i]=d[node]+1;
    
                        q.push(i);
                        vis[i]=1;
                    }
        }
    
    }
    
    
    void print_bfs(int dst)
    {
        memset(vis,0,sizeof(vis));
    
        q.push(1);
        vis[1]=1;
        ma[d[1]]=1;
    
        printf("1");
        while(!q.empty())
        {
            int node=q.front();
            q.pop();
    
            for(int i=1;i<=n;i++)
                if(G[node][i]>0)
                    if(!vis[i])
                        if(d[i]==d[node]-1)
                            if(ma.count(d[i])==0)
                            {
                                printf(" %d",i);
                                vis[i]=1;
                                q.push(i);
                                ma[d[i]]=1;
    
                                if(i==dst) return;
                            }
        }
    }
    
    
    int main()
    {
        
        cin>>n;
        cin>>m;
    
        //cout<<"m:"<<m<<" "<<"n:"<<n<<endl;
    
        init();
    
        int j;
        cin>>j;
    
        bfs(j);
    
        //printf("d1:%d d2:%d d3:%d d4:%d d5:%d
    ",d[1],d[2],d[3],d[4],d[5]);
    
        //printf("G[5][2]=%d G[5][1]=%d G[4][1]=%d G[2][1]=%d G[2][3]=%d G[1][3]=%d
    ",G[5][2],G[5][1],G[4][1],G[2][1],G[2][3],G[1][3]);
    
        print_bfs(j);
        printf("
    ");
    
        return 0;
    }
    Yosoro
  • 相关阅读:
    Redis配置文件的使用
    WEB请求处理一:浏览器请求发起处理
    Nginx配置文件(nginx.conf)配置详解
    【node】------mongoose的基本使用
    Promise.resolve()与new Promise(r => r(v))
    promise是什么?
    apiDoc
    apiDoc 使用指南
    微信小程序-性能与体验优化
    微信小程序-调取上一页的方法
  • 原文地址:https://www.cnblogs.com/tclan126/p/7396004.html
Copyright © 2020-2023  润新知