USACO/fence 3.3.1 欧拉回路

本文介绍了一种求解欧拉回路的方法,通过深度优先搜索(DFS)算法寻找从特定起点出发的路径,并讨论了如何确保路径的有效性。特别关注了节点度数的奇偶性对路径的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题我刚开始没有考虑有环的情况,用了个自以为简单的方法,然后一直错了

代码如下。

#include<stdio.h>
#include<stdlib.h>
int total[510][510]={0};
int min=1000,max=0;
int ans[3000]={0},f=0;
int sum=0;
/*=========================
每个结点从小到大dfs当其没有其它结点时
将其放在输出数组里
===========================*/
void dfs(int n,int m)
{
    int i ,j;
    if(sum==m) return;                                      //访问的边的条数等于m,结束
    for(i=min;i<=max;i++)
    if(total[n][i])
    {
        total[n][i]--;                                               //两者边的条数减1
        total[i][n]--;
        sum++;                                                       //边的条数加1
        dfs(i,m);
        ans[f++]=i;
    }
}
/*===============================
主要了解欧拉回路的性质,当结点度数全部
为偶数时可以从任一结点开始,但只有奇数时
只能从奇数开始,奇数结束。
==============================*/

int main()
{
    FILE *fin=fopen("fence.in","r");
    FILE *fout=fopen("fence.out","w");
    int edge[510]={0};
    int num;
    int i ,j,x,y;
    int start;
    fscanf(fin,"%d",&num);
    for(i=0;i<num;i++)
    {
        fscanf(fin,"%d %d",&x,&y);
        edge[x]++;edge[y]++;
        total[x][y]++;
        total[y][x]++;
        min=min<x?min:x;
        min=min<y?min:y;
        max=max>x?max:x;
        max=max>y?max:y;
    }
    start=min;
    for(i=min;i<=max;i++)
    {
        if(edge[i]%2)
        {
            start=i;
            break;
        }
    }
    dfs(start,num);
    ans[f]=start;
    for(i=f;i>=0;i--)
    {
        fprintf(fout,"%d\n",ans[i]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值