图论相关算法汇总(一)

一. 图的存储结构

      这里,着重讲利用邻接表的存储,邻接表的处理方法是这样的:
    (1)图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便。     
    (2)图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。具体如下图所示。

图论相关算法汇总(一)_第1张图片

二. 宽度优先遍历(BFS)

     算法描述:
    (1)将起始节点放入队列尾部
    (2)While(队列不为空)
                  取得并删除队列首节点Node
                 处理该节点Node
                 把Node的未处理相邻节点加入队列尾部


三. 深度优先遍历(DFS)

     算法描述:
    (1)访问顶点Vo
    (2)依次从顶点1的未被访问的邻接点发出深度遍历

四. 源码

#include"iostream"
#include"cstdlib"
#include"cstdio"
#include"queue"
#include"stack"
#include"cstring"
#define N 100   //顶点最大数 
#define M 10000   //边最大数 
using namespace std;

typedef struct node  //边节点
{  
   int adjvex;  
   node* next;  
}EdgeNode;  
EdgeNode * node[N];  //node[i] 表示顶点i的第一个邻接点地址  
int visited[N];      //访问标志 

int firstadj(int v);   //v第一个邻接点 
int nextadj(int v,int w); //v的w之后的邻接点 
void dfs(int v);     
void dfs1(int v); //dfs非递归算法
void bfs(int v); 
int main()  
{  
	//freopen("a.txt","r",stdin);
	int n,m;  //顶点数和边数 
	int i; 
	EdgeNode *s;
	cin>>n>>m;  
	for(i=1;i>x>>y;
		s=(EdgeNode*)malloc(sizeof(EdgeNode)); 
		s->adjvex=y;       //插入表头 
		s->next=node[x];
		node[x]=s;
		s=(EdgeNode*)malloc(sizeof(EdgeNode)); //无向图 
		s->adjvex=x;
		s->next=node[y];
		node[y]=s;
	} 
		
	for(i=1;i<=n;i++){  // 打印每个结点及其邻接点 
		cout<adjvex;
	return 0;
} 

int nextadj(int v,int w){
	EdgeNode *p=node[v]; 
	while(p!=NULL){
		if(p->adjvex==w)
			break;
		p=p->next;
	}
	p=p->next;
	if(p!=NULL)
		return p->adjvex;
	return 0;
}

void bfs(int v){    // bfs 
	int w,u;
	queue q;
	visited[v]=1;
	cout< s;
	visited[v]=1;
	cout<



你可能感兴趣的:(算法)