• 图算法(邻接矩阵)


    欧拉路径(u,v)是否存在:

      对于连通无向图,u,v 顶点的度均为奇数,其他顶点的度均为偶数;

      对于强连通有向图,其他顶点的出度==入度,u:出度==入度+1,v:入度==出度+1;

    欧拉回路是否存在:

      对于连通无向图,所有顶点的度均为偶数;

      对于强连通有向图,所有顶点的出度==入度;

    计算顶点 v 的度:

    int graphDegree(graph* g, int v)
    {
    	int d = 0;
    	for (int i = 0; i < g->v; ++i)
    		if (g->adj[v][i] != 0) ++d;
    	return d;
    }
    

      

    bfs(邻接矩阵):

    int d[100];	//	记录 s 到各个顶点的距离
    int num = 0;	
    int pi[100]; //记录前驱结点
    void bfs(graph* g, int s)
    {
    	for (int i = 0; i < g->v; ++i) d[i] = -1;
    
    	int v;
    	queue<int> q;
    	q.push(s); d[s] = num++; pi[s] = -1;
    	while (!q.empty()){
    		v = q.front(); q.pop();
    		for (int i = 0; i < g->v; ++i)
    			if (g->adj[v][i] != 0 && d[i] == -1){
    				q.push(i); d[i] = num; pi[i] = v;
    			}
    		++num;
    	}
    }
    

      

    dfs(邻接矩阵):

    //dfs,深度优先搜索
    int dd[100];	//记录顶点的发现时间,需初始化为全 -1
    int fd[100];	//记录顶点的完成时间
    int tm = 0;
    int pid[100];	//记录前驱结点
    void dfsVisit(graph* g, int v)
    {
    	dd[v] = ++tm;
    	for (int i = 0; i < g->v; ++i){
    		if (g->adj[v][i] == 1 && dd[i] == -1){
    			pid[i] = v;
    			dfsVisit(g, i);
    		}
    	}
    	fd[v] = ++tm;
    }
    void dfs(graph* g)
    {
    	for (int i = 0; i < g->v; ++i) dd[i] = -1;
    	for (int i = 0; i < g->v; ++i)
    		if (dd[i] == -1) dfsVisit(g, i);
    }
    

      

    拓扑排序:DFS遍历后,将将顶点按照完成时间从大到小排序,所得序列,即为所有。

  • 相关阅读:
    第三次随笔作业
    第二次随笔作业
    第一次随笔
    第四次随笔作业
    第三次随笔作业
    第二次随笔作业
    第一次博客
    第四次作业
    第三次作业(2)
    第二次随笔(修改版3)
  • 原文地址:https://www.cnblogs.com/jokoz/p/4757634.html
Copyright © 2020-2023  润新知