您的位置:首页 > 其它

STL 实现邻接表的存储与深搜广搜的完美结合不容错过啊!!!

2013-08-22 16:15 176 查看
#include<stdio.h>

#include<vector>

#include<iostream>

#include<string.h>

#include<queue>

#define MAX 100000

using namespace std;

vector<int>map[MAX];/////////////////////////////邻接表定义

int vis[MAX];

char point[MAX];

void dfs(int i){

//从第i个节点开始对图进行深度优先遍历

int j;

printf("%c",point[i]);

vis[i]=1;

for(j=0;j<map[i].size();j++)

if(!vis[map[i][j]])

{

//vis[map[i][j]]=1;

dfs(map[i][j]);

}

}

void bfs(int i){

//从第i个节点开始对图进行广度优先遍历

int t,j;

queue<int>q;

q.push(i);

vis[i]=1;

printf("%c",point[i]);

while(!q.empty())

{

t=q.front();

q.pop();

for(j=0;j<map[t].size();j++)

if(!vis[map[t][j]])

{

printf("%c",point[map[t][j]]);

vis[map[t][j]]=1;

q.push(map[t][j]);

}

}//while

}

int main()

{

memset(vis,0,sizeof(vis));

int n,m,a,b,i;

scanf("%d %d",&n,&m);//输入点数和边数

scanf("%s",point);

for(i=0;i<MAX;i++)

map[i].clear();//清空行链表

for(i=1;i<=m;i++)

{

scanf("%d %d",&a,&b);

map[a].push_back(b);

map[b].push_back(a);

}

for(i=0;i<strlen(point);i++)

if(!vis[i])

{

dfs(i);//深度优先遍历

puts("");

}

memset(vis,0,sizeof(vis));

for(i=0;i<strlen(point);i++)

if(!vis[i])

{

bfs(i);//深度优先遍历

puts("");

}

system("pause");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: