完善下列代码,要求输入格式: 第一行输入结点数n(n<=10),第二行输入无向图关系矩阵的上三角元素为1的一对结点编号,结点编号之间以空格分隔;第三行输入无向图关系矩阵的下三角元素为1的一对结点编号,结点之间以空格分隔。输入 -1 -1则结束输入。 输出格式: 输出a是否欧拉图、半欧拉图或者不是欧拉图。#include <stdio.h> const int N = 10; //判断无向图是否欧拉图 //返回值为奇度数结点数 int euler1(int** a, int n) { //begin************* //end**************** } int main( ) { int** a1;//无向图 int n, i, j; scanf("%d", &n);//读入结点数 if (n > N) { printf("error\n"); return 0; } a1 = new int* [n]; for (i = 0; i < n; i++) { a1[i] = new int[n]; for (j = 0; j < n; j++) { a1[i][j] = 0; } } while (1) { scanf("%d%d", &i, &j);//读入无向边 //begin***** //end*********** } int odd = euler1(a1, n); if (odd == 0) { printf("a is euler\n"); } else if (odd == 2) printf("a is semi-euler\n"); else printf("a is not euler\n"); }
时间: 2023-07-23 09:13:55 浏览: 77
完善后的代码如下:
```c++
#include <stdio.h>
const int N = 10;
//判断无向图是否欧拉图
//返回值为奇度数结点数
int euler1(int** a, int n) {
int cnt = 0;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < n; j++) {
sum += a[i][j];
}
if (sum % 2 != 0) cnt++;
}
return cnt;
}
int main( ) {
int** a1;//无向图
int n, i, j;
scanf("%d", &n); //读入结点数
if (n > N) {
printf("error\n");
return 0;
}
a1 = new int* [n];
for (i = 0; i < n; i++) {
a1[i] = new int[n];
for (j = 0; j < n; j++) {
a1[i][j] = 0;
}
}
while (1) {
scanf("%d%d", &i, &j); //读入无向边
if (i == -1 && j == -1) break;
a1[i][j] = a1[j][i] = 1;
}
int odd = euler1(a1, n);
if (odd == 0) {
printf("a is euler\n");
} else if (odd == 2) {
printf("a is semi-euler\n");
} else {
printf("a is not euler\n");
}
return 0;
}
```
注释中的 //begin 和 //end 之间需要添加相应的代码。
该程序中使用邻接矩阵来表示无向图,其中 a1[i][j] 表示结点 i 和结点 j 之间是否有边相连。在循环读入无向边的过程中,通过 a1[i][j] = a1[j][i] = 1; 将无向边的信息存储到邻接矩阵中。最后调用 euler1 函数来判断无向图是否为欧拉图、半欧拉图或者不是欧拉图。
阅读全文