寻找欧拉路

寻找欧拉路

Time Limit:10000MS  Memory Limit:65536K
Total Submit:49 Accepted:27
Case Time Limit:1000MS

Description

如果图存在一笔画,则一笔画的路径称为欧拉路

Input

第一行n,m,有n个点,m条边,以下描述每条边连接的两点。

Output

欧拉或欧拉回路

Sample Input

5 5 
1 2
2 3
3 4
4 5
5 1

Sample Output

1 5 4 3 2 1

从起点开始有相邻节点继续搜


 
 
  • const
      maxn=100;
    var
      a:array[0..maxn,0..maxn] of longint;
      ans,b:array[0..maxn] of longint;
      i,j,n,m,s,p:longint;
    
    procedure find(i:longint);
    var
      j:longint;
    begin
      for j:=1 to n do
        if a[i,j]=1 then
          begin
            a[i,j]:=0;
            a[j,i]:=0;
            find(j);
          end;
      inc(s);
      ans[s]:=i;
    end;
    
    begin
      readln(n,m);
      for i:=1 to m do
        begin
          readln(j,p);
          a[j,p]:=1;
          a[p,j]:=1;
          inc(b[j]);
          inc(b[p]);
        end;
      p:=1;
      for i:=1 to n do
        if b[i] mod 2=1 then p:=i;
      find(p);
      for i:=1 to s do
        write(ans[i],' ');
    end.

优化一下下面的代码#include <stdio.h> #define N 100 //最大节点数 #define M 10000 //最大边数 int r[N][N]; //邻接矩阵 int degree[N]; //每个节点的度数 int sequence[M]; //欧拉经过的边的序号 int count = 0; //欧拉的数量 int n, m; //节点数和边数 //判断是否是欧拉图 int is_euler_graph() { int i; for (i = 1; i <= n; i++) { if (degree[i] % 2 != 0) { return 0; //有一个节点的度数是奇数,不是欧拉图 } } return 1; } //判断是否是欧拉 int is_euler_circuit() { int i; for (i = 1; i <= n; i++) { if (degree[i] != 0) { break; //找到一个非孤立点 } } if (i > n) { return 0; //所有节点都是孤立点,不是欧拉 } for (i = 1; i <= n; i++) { if (degree[i] % 2 != 0) { return 0; //有一个节点的度数是奇数,不是欧拉 } } return 1; } //寻找欧拉 void find_euler_path(int cur) { int i, j; for (i = 1; i <= n; i++) { if (r[cur][i]) { r[cur][i] = r[i][cur] = 0; //删除当前边 for (j = 1; j <= m; j++) { if (sequence[j] == 0) { sequence[j] = cur * 100 + i; //记录访问的边 break; } } find_euler_path(i); //递归寻找下一条边 break; } } } int main() { int i, j, x, y; printf("请输入节点数和边数:"); scanf("%d%d", &n, &m); for (i = 1; i <= m; i++) { printf("请输入第%d条边的起点和终点:", i); scanf("%d%d", &x, &y); r[x][y] = r[y][x] = 1; //无向图,边是双向的 degree[x]++; degree[y]++; } if (is_euler_graph()) { printf("这是一个欧拉图\n"); if (is_euler_circuit()) { printf("这是一个欧拉欧拉如下:\n"); find_euler_path(1); for (i = 1; i <= m; i++) { printf("%d -> %d\n", sequence[i] / 100, sequence[i] % 100); } } else { printf("这不是一个欧拉,但是有欧拉欧拉如下:\n"); for (i = 1; i <= n; i++) { if (degree[i] % 2 != 0) { break; } } find_euler_path(i); for (j = 1; j <= m; j++) { if (sequence[j] == 0) { break; } } for (i = j - 1; i >= 1; i--) { printf("%d -> %d\n", sequence[i] / 100, sequence[i] % 100); } } } else { printf("这不是一个欧拉图\n"); } return 0; }
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值