您的位置:首页 > 其它

深度优先搜索和广度优先搜索

2016-11-29 15:54 260 查看
//DFS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector< vector<int> > V; //邻接表
vector<int> visit;
int n;//点数
int m;//边数
vector<int> ans;
void dfs(int n){
ans.push_back(n);
visit
= 1;
for(int j=0;j<V
.size();j++){
if(!visit[V
[j]]) //如果邻接的点未被访问过则访问邻接点
dfs(V
[j]);
}
}
bool cmp(int a,int b){
return a>b;}
int main(){
V.clear();
visit.clear();//先初始化两个都为空
cin>>n;cin>>m;

visit.resize(n+1);
V.resize(n+1);//假设角标从1开始到n

for(int i=0;i<visit.size();i++)//初始化为未访问  等下回来在优化
visit[i] = 0;

for(int i=0;i<m;i++){//建立V
int st,ed;
cin>>st>>ed;
V[st].push_back(ed);
V[ed].push_back(st);
}
for(int i=1;i<=n;i++)
{
int sz = V[i].size();
sort(V[i].begin(),V[i].end(),cmp);
}
for(int i=1;i<=n;i++){
if(!visit[i])
dfs(i);
}
int first = 1;
for(int i=0 ;i<n;i++){
if(first) first = 0;
else cout<<"-->";
cout<<ans[i];
}
return 0;
}
/*
input:
6
10
1 2
1 3
1 5
5 2
5 3
5 6
4 2
4 3
4 5
4 6
output:
1-->5-->6-->4-->3-->2
*/

//BFS
#include"iostream"
#include"algorithm"
#include"queue"
using namespace std;
int n;
int m;
queue<int> Q;
vector< vector<int> > G;//邻接表
vector<int> visit;      //标志数组
vector<int> ans;        //访问路径

void bfs(){
for(int i=1;i<=n;i++){
if(!visit[i]) {
Q.push(i);
visit[i] = 1;
while(!Q.empty()){

int now = Q.front();
Q.pop();

ans.push_back(now);
for(int j = 0;j < G[now].size();j++){
if(!visit[G[now][j]])
{
Q.push(G[now][j]);
visit[G[now][j]]=1;
}
}
}
}
}
}

bool cmp(int a,int b){
return a>b;}
int main(){
cin>>n>>m;

G.resize(n+1);
visit.resize(n+1);

for(int i=0;i<=n;i++)
visit[i] = 0;
for(int i = 0;i< m;i++){
int st,ed;
cin>>st>>ed;
G[st].push_back(ed);
G[ed].push_back(st);
}

for(int i=1;i<=n;i++)
{
sort(G[i].begin(),G[i].end(),cmp);
}

bfs();

int first = 1;
for(int i=0;i<ans.size();i++)
{
if(first) first = 0;
else cout<<"-->";
cout<<ans[i];
}

return 0;

}
/*
input:
6
10
1 2
1 3
1 5
5 2
5 3
5 6
4 2
4 3
4 5
4 6
output
1-->5-->3-->2-->6-->4
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: