您的位置:首页 > 其它

图算法(邻接矩阵)

2015-08-25 15:38 696 查看
欧拉路径(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遍历后,将将顶点按照完成时间从大到小排序,所得序列,即为所有。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: