无向图的路径判断

 

 

 这道题非常简单但为了应付完成老师的作业还是写吧

思路:与有向图(Cow Picnic S    Cow Picnic S 更新了(在后面) - 王浩泽 - 博客园 (cnblogs.com))差不多,只是输入以及写法注意一下即可。有       普通mp写法 🔥推荐  宽搜写法   深搜写法(要剪枝)🔥推荐 vector edge  写法

 

普通mp写法、🔥推荐  宽搜写法 :

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,t,vis[1010]={0},mp[1010][1010]={0},ans=0; 
 4 int x,y;
 5 queue <int> q;
 6 void bfs(int k)
 7 {
 8     q.push(k);
 9     while(!q.empty())
10     {
11         int op=q.front();
12         if(op==y)
13         {
14             ans=1;
15             return;
16         }
17         else
18         {
19             int np;
20             for(int i=1;i<=n;i++)
21             {
22                 np=i;
23                 if(vis[np]==0&&mp[op][np]==1)
24                 {
25                     vis[np]=1;
26                     q.push(np);
27                 }
28             }
29         }
30         q.pop();
31     }
32 }
33 int main()
34 {
35     cin>>n>>m>>t;
36     for(int i=1;i<=m;i++)
37     {
38         int a,b;
39         cin>>a>>b;
40         mp[a][b]=1;
41         mp[b][a]=1;
42     }
43     while(t--)
44     {
45         ans=0;
46         memset(vis,0,sizeof(vis));
47         while(q.size()) q.pop();
48         cin>>x>>y;
49         vis[x]=1;
50         bfs(x);
51         if(ans==1) cout<<"Yes"<<endl;
52         else cout<<"No"<<endl;
53     }
54     return 0;
55 }

 

深搜写法(要剪枝):

#include<bits/stdc++.h>
using namespace std;
int n,m,t,vis[1010]={0},mp[1010][1010]={0},ans=0; 
int x,y;
void dfs(int k)
{
    if(k==y)
    {
        ans=1;
        return;
    }
    else
    {
        for(int i=1;i<=n&&ans==0;i++)
        {
            if(vis[i]==0&&mp[k][i]==1)
            {
                vis[i]=1;
                dfs(i);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    cin>>n>>m>>t;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        mp[a][b]=1;
        mp[b][a]=1;
    }
    while(t--)
    {
        ans=0;
        memset(vis,0,sizeof(vis));
        cin>>x>>y;
        vis[x]=1;
        dfs(x);
        if(ans==1) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

🔥推荐 vector edge  写法:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,t,vis[1010]={0},mp[1010][1010]={0},ans=0; 
 4 int x,y;
 5 vector<int> edge[1010];
 6 void dfs(int k)
 7 {
 8     if(k==y)
 9     {
10         ans=1;
11         return;
12     }
13     else
14     {
15         for(int i=0;i<edge[k].size()&&ans==0;i++)
16         {
17             if(vis[edge[k][i]]==0)
18             {
19                 vis[edge[k][i]]=1;
20                 dfs(edge[k][i]);
21             }
22         }
23     }
24 }
25 int main()
26 {
27     cin>>n>>m>>t;
28     for(int i=1;i<=m;i++)
29     {
30         int a,b;
31         cin>>a>>b;
32         edge[a].push_back(b);
33         edge[b].push_back(a);
34     }
35     while(t--)
36     {
37         ans=0;
38         memset(vis,0,sizeof(vis));
39         cin>>x>>y;
40         vis[x]=1;
41         dfs(x);
42         if(ans==1) cout<<"Yes"<<endl;
43         else cout<<"No"<<endl;
44     }
45     return 0;
46 }

 

posted @ 2022-04-16 21:45  王浩泽  阅读(84)  评论(0)    收藏  举报