//邻接矩阵表示法
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<queue>
#include<limits.h>
using namespace std;
const int M=100;
enum COLOR{WHITE,GRAY,BLACK};
struct VERTEX{
int index;//点的编号
int distance;
int previous;//前驱结点编号,0代表无
COLOR color;
};
class GRAPH{
public:
VERTEX vertex[M];//点集
bool adjacency[M][M];//邻接矩阵。adjacency[i][j]=true代表点i,j之间有边
int n;//点数
void read(){
scanf("%d\n",&n);
memset(adjacency,0,sizeof(adjacency));
for(int i=1;i<=n;i++){
stringstream stream;string line;
getline(cin,line);
stream<<line;
int pointindex;
//读入邻接点
while(stream>>pointindex){
//printf("%d\n",pointindex);
if(pointindex==0) break;//此行为0代表没有邻接点
adjacency[i][pointindex]=true;
}
}
}
void BFS(int srcindex){
for(int i=1;i<=n;i++)
if(i!=srcindex){
vertex[i].distance=INT_MAX;
vertex[i].previous=0;
vertex[i].color=WHITE;
}
vertex[srcindex].distance=0;
vertex[srcindex].previous=0;
vertex[srcindex].color=GRAY;
queue<int> QUEUE;
QUEUE.push(srcindex);
while(!QUEUE.empty()){
int v=QUEUE.front();QUEUE.pop();
printf("visit:%d\n",v);
for(int adj=1;adj<=n;adj++)
if(adjacency[v][adj])//v的所有邻接点入队
if(vertex[adj].color==WHITE){
QUEUE.push(adj);
vertex[adj].distance=vertex[v].distance+1;
vertex[adj].previous=v;
vertex[adj].color=GRAY;//刚被发现
}
vertex[v].color=BLACK;//所有邻接点已发现
}
}
void print(){
for(int i=1;i<=n;i++){
printf("%d:",i);
for(int j=1;j<=n;j++)
if(adjacency[i][j]) printf("%d ",j);
printf("\n");
}
}
void PRINT_PATH(int srcindex,int endindex){
if(srcindex==endindex) printf("%d",srcindex);
else if(vertex[endindex].previous==0)
printf("no path from %d to %d.",srcindex,endindex);
else{
PRINT_PATH(srcindex,vertex[endindex].previous);
printf("%d",endindex);
}
}
};
//图的输入。第1行是点的数量。
//接下来的2~n+1行,第i+1行是点i的邻接点,以空格隔开。
//对于有向图,adjacency[i][j]=1代表有i指向j的边。
//若无邻接点,此行填0。
/*
8
2 5
6 1
4 6 7
3 7 8
1
2 3 7
3 4 6 8
4 7
*/
int main()
{
//freopen("1.txt","r",stdin);
GRAPH graph;
graph.read();
graph.print();
graph.BFS(3);
graph.PRINT_PATH(3,1);
return 0;
}
邻接链表表示法
- #include<cstdio>
- #include<iostream>
- #include<sstream>
- #include<queue>
- #include<limits.h>
- using namespace std;
- const int M=100;
- enum COLOR{WHITE,GRAY,BLACK};
- struct LINK_LIST{
- int index;LINK_LIST* next;
- LINK_LIST(int index){this->index=index;}
- };
- struct VERTEX{
- int index;//点的编号
- int distance;
- int previous;//前驱结点编号,0代表无
- COLOR color;
- };
- class GRAPH{
- public:
- VERTEX vertex[M];//点集
- LINK_LIST* adjacency[M];//点集的邻接点链表
- int n;//点数
- void read(){
- scanf("%d\n",&n);
- for(int i=1;i<=n;i++) adjacency[i]=NULL;
- for(int i=1;i<=n;i++){
- stringstream stream;string line;
- getline(cin,line);
- stream<<line;
- int pointindex;LINK_LIST*current,*last=NULL;
- //读入邻接点
- while(stream>>pointindex){
- //printf("%d\n",pointindex);
- if(pointindex==0) break;//此行为0代表没有邻接点
- current=new LINK_LIST(pointindex);
- if(adjacency[i]==NULL)//还没读过邻接点
- adjacency[i]=current;
- else last->next=current;
- last=current;
- }
- if(last) last->next=NULL;
- }
- }
- void BFS(int srcindex){
- for(int i=1;i<=n;i++)
- if(i!=srcindex){
- vertex[i].distance=INT_MAX;
- vertex[i].previous=0;
- vertex[i].color=WHITE;
- }
- vertex[srcindex].distance=0;
- vertex[srcindex].previous=0;
- vertex[srcindex].color=GRAY;
- queue<int> QUEUE;
- QUEUE.push(srcindex);
- while(!QUEUE.empty()){
- int v=QUEUE.front();QUEUE.pop();
- printf("visit:%d\n",v);
- LINK_LIST* node=adjacency[v];
- while(node){
- if(vertex[node->index].color==WHITE){//v的所有邻接点入队
- int adj=node->index;
- QUEUE.push(adj);
- vertex[adj].distance=vertex[v].distance+1;
- vertex[adj].previous=v;
- vertex[adj].color=GRAY;//刚被发现
- }
- node=node->next;
- }
- vertex[v].color=BLACK;//所有邻接点已发现
- }
- }
- void print(){
- for(int i=1;i<=n;i++){
- printf("%d:",i);
- LINK_LIST* node=adjacency[i];
- while(node){
- printf("%d ",node->index);
- node=node->next;
- }
- printf("\n");
- }
- }
- void PRINT_PATH(int srcindex,int endindex){
- if(srcindex==endindex) printf("%d",srcindex);
- else if(vertex[endindex].previous==0)
- printf("no path from %d to %d.",srcindex,endindex);
- else{
- PRINT_PATH(srcindex,vertex[endindex].previous);
- printf("%d",endindex);
- }
- }
- };
- //图的输入。第1行是点的数量。
- //接下来的2~n+1行,第i+1行是点i的邻接点,以空格隔开。
- //对于有向图,adjacency[i]链表存的是点i射向的点。
- //若无邻接点,此行填0。
- /*
- 8
- 2 5
- 6 1
- 4 6 7
- 3 7 8
- 1
- 2 3 7
- 3 4 6 8
- 4 7
- */
- int main()
- {
- freopen("1.txt","r",stdin);
- GRAPH graph;
- graph.read();
- graph.print();
- graph.BFS(8);
- graph.PRINT_PATH(8,5);
- return 0;
- }
无向图bfs
- #include<cstdio>
- #include<iostream>
- #include<sstream>
- #include<queue>
- #include<limits.h>
- using namespace std;
- const int M=100;
- enum COLOR{WHITE,GRAY,BLACK};
- struct LINK_LIST{
- int index;LINK_LIST* next;
- LINK_LIST(int index){this->index=index;}
- };
- struct VERTEX{
- int index;//点的编号
- int distance;
- int previous;//前驱结点编号,0代表无
- COLOR color;
- };
- class GRAPH{
- public:
- VERTEX vertex[M];//点集
- LINK_LIST* adjacency[M];//点集的邻接点链表
- int n;//点数
- void read(){
- scanf("%d\n",&n);
- for(int i=1;i<=n;i++) adjacency[i]=NULL;
- for(int i=1;i<=n;i++){
- stringstream stream;string line;
- getline(cin,line);
- stream<<line;
- int pointindex;LINK_LIST*current,*last=NULL;
- //读入邻接点
- while(stream>>pointindex){
- //printf("%d\n",pointindex);
- if(pointindex==0) break;//此行为0代表没有邻接点
- current=new LINK_LIST(pointindex);
- if(adjacency[i]==NULL)//还没读过邻接点
- adjacency[i]=current;
- else last->next=current;
- last=current;
- }
- if(last) last->next=NULL;
- }
- }
- void BFS(int srcindex){
- for(int i=1;i<=n;i++)
- if(i!=srcindex){
- vertex[i].distance=INT_MAX;
- vertex[i].previous=0;
- vertex[i].color=WHITE;
- }
- vertex[srcindex].distance=0;
- vertex[srcindex].previous=0;
- vertex[srcindex].color=GRAY;
- queue<int> QUEUE;
- QUEUE.push(srcindex);
- while(!QUEUE.empty()){
- int v=QUEUE.front();QUEUE.pop();
- printf("visit:%d\n",v);
- LINK_LIST* node=adjacency[v];
- while(node){
- if(vertex[node->index].color==WHITE){//v的所有邻接点入队
- int adj=node->index;
- QUEUE.push(adj);
- vertex[adj].distance=vertex[v].distance+1;
- vertex[adj].previous=v;
- vertex[adj].color=GRAY;//刚被发现
- }
- node=node->next;
- }
- vertex[v].color=BLACK;//所有邻接点已发现
- }
- }
- void print(){
- for(int i=1;i<=n;i++){
- printf("%d:",i);
- LINK_LIST* node=adjacency[i];
- while(node){
- printf("%d ",node->index);
- node=node->next;
- }
- printf("\n");
- }
- }
- void PRINT_PATH(int srcindex,int endindex){
- if(srcindex==endindex) printf("%d",srcindex);
- else if(vertex[endindex].previous==0)
- printf("no path from %d to %d.",srcindex,endindex);
- else{
- PRINT_PATH(srcindex,vertex[endindex].previous);
- printf("%d",endindex);
- }
- }
- };
- int main()
- {
- freopen("1.txt","r",stdin);
- GRAPH graph;
- graph.read();
- graph.print();
- graph.BFS(8);
- graph.PRINT_PATH(8,5);
- return 0;
- }