仿写一下下面的代码实验六 欧拉图判定和应用 【实验目的】掌握判断欧拉图的方法。 【实验内容】 判断一个图是不是,如果是,求出所有欧拉路 【实验原理和方法】 (1)用关系矩阵R=表示图。 (2)对无向图而言,若所有结点的度都是偶数,则该图为欧拉图。 C语言算法: flag=1; for(i=1;i<=n && flag;i++) { sum=0; for(j=1;j<=n;j++) if(r[i][j]) sum++; if(sum%2==0) flag=0; } 如果 flag 该无向图是欧拉图 (3)对有向图而言,若所有结点的入度等于出度,则该图为欧拉图。 C语言算法: flag=1; for(i=1;i<=n && flag;i++) { sum1=0; sum2=0; for(j=1;j<=n;j++) if(r[i][j]) sum1++; for(j=1;j<=n;j++) if(r[j][i]) sum2++; if(sum1%2==0 || sum2%2==0) flag=0; } 如果 flag 该有向图是欧拉图 (4)求出欧拉路的方法:欧拉路经过每条边一次且仅一次。可用回溯的方法求得所有欧拉路。 C语言算法: int count=0,cur=0,r[N][N]; // r[N][N]为图的邻接矩阵,cur为当前结点编号,count为欧拉路的数量。 int sequence[M];// sequence保留访问点的序列,M为图的边数 输入图信息; void try1(int k) //k表示边的序号 { int i,pre=cur; //j保留前一个点的位置,pre为前一结点的编号 for (i=0;i<N;i++) if (r[cur][i]) //当前第cur点到第i点连通 { //删除当前点与第i点的边,记下第k次到达点i,把第i个点设为当前点 r[cur][i]=0;cur=sequence[k]=i; if (k<M) try1(k+1); //试下一个点 else prt1();//经过了所有边,打印一个解 //上面条件不满足,说明当前点的出度为0,回溯,试下一位置 r[pre][i]=1;cur=pre; } }
时间: 2024-03-28 13:37:20 浏览: 127
wk2114 Demo,c语言源码判断欧拉图的方法,c语言
好的,以下是仿写的C语言代码实现:
// 判断无向图是否为欧拉图,如果是,返回1,否则返回0
int isEulerGraph(int r[][N], int n) {
int flag = 1;
for(int i = 0; i < n && flag; i++) {
int sum = 0;
for(int j = 0; j < n; j++) {
if(r[i][j])
sum++;
}
if(sum % 2 == 1)
flag = 0;
}
return flag;
}
// 判断有向图是否为欧拉图,如果是,返回1,否则返回0
int isEulerDigraph(int r[][N], int n) {
int flag = 1;
for(int i = 0; i < n && flag; i++) {
int sum1 = 0, sum2 = 0;
for(int j = 0; j < n; j++) {
if(r[i][j])
sum1++;
if(r[j][i])
sum2++;
}
if(sum1 != sum2)
flag = 0;
}
return flag;
}
int count = 0, cur = 0, r[N][N], sequence[M];
// 求无向图的欧拉路
void try1(int k) {
int i, pre = cur;
for(i = 0; i < N; i++) {
if(r[cur][i]) {
r[cur][i] = 0;
r[i][cur] = 0;
cur = sequence[k] = i;
if(k < M - 1)
try1(k + 1);
else {
count++;
prt1();
}
r[cur][pre] = 1;
r[pre][cur] = 1;
cur = pre;
}
}
}
// 求有向图的欧拉路
void try2(int k) {
int i, pre = cur;
for(i = 0; i < N; i++) {
if(r[cur][i]) {
r[cur][i] = 0;
cur = sequence[k] = i;
if(k < M - 1)
try2(k + 1);
else {
count++;
prt1();
}
r[cur][pre] = 1;
cur = pre;
}
}
}
// 主函数
int main() {
int n, m, i, j;
scanf("%d%d", &n, &m);
memset(r, 0, sizeof(r));
for(i = 0; i < m; i++) {
int x, y;
scanf("%d%d", &x, &y);
r[x][y] = 1;
r[y][x] = 1;
}
if(isEulerGraph(r, n)) {
memset(sequence, -1, sizeof(sequence));
try1(0);
printf("Total number of Euler paths: %d\n", count);
}
else if(isEulerDigraph(r, n)) {
memset(sequence, -1, sizeof(sequence));
try2(0);
printf("Total number of Euler paths: %d\n", count);
}
else
printf("This graph is not an Euler graph.\n");
return 0;
}
以上是仿写的C语言代码实现,其中包括了判断无向图和有向图是否为欧拉图的函数,以及求解欧拉路的回溯算法。根据输入的图信息,程序会判断图是否为欧拉图,并求出所有欧拉路的数量和路径。
阅读全文