无向图的路径判断

这道题非常简单但为了应付完成老师的作业还是写吧
思路:与有向图(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 }

浙公网安备 33010602011771号