首先输入结点个数,接着调用generateAdj函数随机生成邻接矩阵,最后调用judge函数判定是否为(半)欧拉图,其中调用findPath函数给出欧拉(回)路。
#include#include #include #define N 10 using namespace std; int adj[N][N]; void generateAdj(int n) //生成邻接矩阵 { srand((int)time(0)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { adj[i][j] = adj[j][i] = rand() % 2; //对称随机生成 } adj[i][i] = 0; } cout << "随机生成的邻接矩阵为:"< " << path[i]; } return; } for (int i = 0; i < n; i++) { if (adj[v][i] == 1 && vis[v][i] == 0) //有边并且没走过 { vis[v][i] = vis[i][v] = 1; path[index++] = i+1; findPath(i,n); //递归找路 } } } void judge(int n) { int tmp[N][N] = { 0 }; int b[N][N] = { 0 }; int a[N][N] = { 0 }; int deg[N] = { 0 }; //记录每个结点的度数 int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = b[i][j] = adj[i][j]; } } for (int t = 1; t < n; t++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { tmp[i][j] += a[i][k] * adj[k][j]; //矩阵乘法 } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = tmp[i][j]; b[i][j] += a[i][j]; tmp[i][j] = 0; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (b[i][j] == 0) { cout << "该图不连通。"< > n; generateAdj(n); judge(n); return 0; }



