第六章部分例题

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("\n");
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\n",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\n",G[5][2],G[5][1],G[4][1],G[2][1],G[2][3],G[1][3]);

    print_bfs(j);
    printf("\n");

    return 0;
}

 

posted @ 2017-08-19 11:39  lan126  阅读(135)  评论(0编辑  收藏  举报