int IsExistEL(MGraph G) {
//采用邻接矩阵存储,判断图是否存在 EL 路径
int degree, i, j, count = 0;
for (i = 0; i < G.numVertices; i++) {
degree = 0;
for (j = 0; j < G.numVertices; j++)
degree += G.Edge[i][j]; //依次计算各个顶点的度
if (degree % 2 != 0)
count++; //对度为奇数的顶点计数
}
if (count == 0 || count == 2)
return 1; //存在 EL 路径,返回 1
else
return 0; //不存在 EL 路径,返回 0
}
int printVertices (MGraph G) {
//采用邻接矩阵存储,输出 K 顶点,返回个数
int indegree, outdegree, k, m, count=0;
for (k=0;k<G.numVertices;k++) {
indegree=outdegree=0;
for (m=0;m<G.numVertices;m++) //计算顶点的出度
outdegree+=G.Edge [k][m];
for (m=0;m<G.numVertices;m++) //计算顶点的入度
indegree+=G.Edge [m][k];
if (outdegree>indegree) {
printf("%c",G.VerticesList[k]);
count++;
}
}
return count; //返回 K 顶点的个数
}
#include <vector>
#include <queue>
using namespace std;
// 邻接表结构
struct ALNode {
int adjvex;
ALNode* next;
ALNode(int v) : adjvex(v), next(nullptr) {}
};
struct ALGraph {
vector<ALNode*> vertices;
int numVertices;
ALGraph(int n) : numVertices(n), vertices(n, nullptr) {}
};
bool isBipartite(ALGraph& G) {
vector<int> color(G.numVertices, -1); // -1表示未染色,0和1表示两种颜色
queue<int> q;
for (int i = 0; i < G.numVertices; ++i) {
if (color[i] == -1) { // 未访问过的顶点
q.push(i);
color[i] = 0; // 初始染色为0
while (!q.empty()) {
int u = q.front();
q.pop();
ALNode* p = G.vertices[u];
while (p != nullptr) {
int v = p->adjvex;
if (color[v] == -1) { // 未染色,染成相反颜色
color[v] = color[u] ^ 1;
q.push(v);
} else if (color[v] == color[u]) { // 颜色冲突,非二分图
return false;
}
p = p->next;
}
}
}
}
return true; // 所有顶点检查完毕,无冲突
}
bool isTree (Graph& G) {
for (i=1;i<=G.vexnum;i++)
visited[i]=FALSE; //访问标记 visited[]初始化
int Vnum=0,Enum=0; //记录顶点数和边数
DFS (G,1,Vnum,Enum,visited);
if (Vnum==G.vexnum&&Enum==2*(G.vexnum-1))
return true; //符合树的条件
else
return false; //不符合树的条件
}
void DFS(Graph& G,int v,int& Vnum,int& Enum,int visited[]){
//深度优先遍历图 G,统计访问过的顶点数和边数,通过 Vnum 和 Enum 返回
visited[v]=TRUE;Vnum++; //作访问标记,顶点计数
int w=FirstNeighbor (G,v); //取 v 的第一个邻接顶点
while (w!=-1) { //当邻接顶点存在
Enum++; //边存在,边计数
if (!visited[w]) //当该邻接顶点未访问过
DFS (G,w,Vnum,Enum,visited);
w=NextNeighbor (G,v,w);
}
}
int visited[MAXSIZE] = {0}; //访问标记数组
void DFS(ALGraph G, int i, int j, bool &can_reach) {
//深度优先判断有向图 G 中顶点 v_i 到顶点 v_j 是否有路径,用 can_reach 来标识
if (i == j) {
can_reach = true;
return; //i 就是 j
}
visited[i] = 1; //置访问标记
for (int p = FirstNeighbor(G, i); p >= 0; p = NextNeighbor(G, i, p))
if (!visited[p] && !can_reach) //递归检测邻接点
DFS(G, p, j, can_reach);
}
int visited[MAXSIZE]={0}; //访问标记数组
int BFS(ALGraph G, int i,int j){
//广度优先判断有向图 G 中顶点 v_i到顶点 v_j是否有路径,是则返回 1,否则返回 0
InitQueue(Q); EnQueue(Q,i); //顶点 i 入队
while(!isEmpty(Q)){ //非空循环
DeQueue(Q,i); //队头顶点出队
visited[i]=1; //置访问标记
if(i==j) return 1;
for(int p=FirstNeighbor(G,i);p;p=NextNeighbor(G,i,p)){
//检查所有邻接点
if(p==j)
return 1; //若 p==j,则查找成功
if(!visited[p]){ //否则,顶点 p 入队
EnQueue(Q,p);
visited[p]=1;
}
}
}
return 0;
}
void FindPath(AGraph *G,int u,int v,int path[],int d){
int w;
ArcNode *p;
d++; //路径长度增1
path[d]=u; //将当前顶点添加到路径中
visited[u]=1; //置已访问标记
if(u==v) //找到一条路径则输出
print(path[]); //输出路径上的结点
p=G->adjlist[u].firstarc; //p指向u的第一个相邻点
while(p!=NULL){
w=p->adjvex; //若顶点w未访问,递归访问它
if(visited[w]==0)
FindPath(G,w,v,path,d);
p=p->nextarc; //p指向u的下一个相邻点
}
visited[u]=0; //恢复环境,使该顶点可重新使用
}
void FindPath(AGraph *G,int u,int v,int path[],int d){
int w;
ArcNode *p;
d++; //路径长度增1
path[d]=u; //将当前顶点添加到路径中
visited[u]=1; //置已访问标记
if(u==v) //找到一条路径则输出
print(path[]); //输出路径上的结点
p=G->adjlist[u].firstarc; //p指向u的第一个相邻点
while(p!=NULL){
w=p->adjvex; //若顶点w未访问,递归访问它
if(visited[w]==0)
FindPath(G,w,v,path,d);
p=p->nextarc; //p指向u的下一个相邻点
}
visited[u]=0; //恢复环境,使该顶点可重新使用
}
bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFSTraverse(Graph G){
for(v=0;v<G.vexnum;++v)
visited[v]=FALSE; //初始化访问标记数组
time=0;
for(v=0;v<G.vexnum;++v) //本代码从v=0开始遍历
if(!visited[v]) DFS(G,v);
}
void DFS(Graph G,int v){
visited[v]=TRUE;
visit(v);
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(!visited[w]){ //w为v的尚未访问的邻接点
DFS(G,w);
}
time=time+1;finishTime[v]=time;
}
typedef struct{
unsigned int ID, IP;
}LinkNode; //Link 的结构
typedef struct{
unsigned int Prefix, Mask;
}NetNode; //Net 的结构
typedef struct Node{
int Flag; //Flag=1 为 Link;Flag=2 为 Net
union{
LinkNode Lnode;
NetNode Nnode
}LinkORNet;
Unsigned int Metric;
struct Node *next;
}ArcNode; //弧结点
typedef struct hNode{
unsigned int RouterID;
ArcNode *LN_link;
struct hNode *next;
}HNODE; //表头结点
//例如,取 x 邻接顶点 y 的下一个邻接顶点的函数 NextNeighbor (G, x, y)。
//1)用邻接矩阵作为存储结构
int NextNeighbor (MGraph& G, int x, int y) {
if (x != -1 && y != -1) {
for (int col = y + 1; col < G.vexnum; col++)
if (G.Edge[x][col] > 0 && G.Edge[x][col] < maxWeight)
return col; //maxWeight 代表∞
}
return -1;
}
//2)用邻接表作为存储结构
int NextNeighbor (ALGraph& G, int x, int y) {
if (x != -1) {
ArcNode *p = G.vertices[x].first; //顶点 x 存在,对应边链表第一个边结点
while (p != NULL && p->data != y) //寻找邻接顶点 y
p = p->next;
if (p != NULL && p->next != NULL)
return p->next->data; //返回下一个邻接顶点
}
return -1;
}