USACO 3.3.1 骑马修栅栏

本文详细介绍了USACO3.3.1骑马修栅栏问题的解决方法,通过使用邻接矩阵来表示栅栏间的连接,并采用递归算法寻找最优解路径。针对奇数度节点进行特殊处理,确保最终能够形成一条完整的路径。

USACO 3.3.1 骑马修栅栏
2017年6月2日


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int F, N;
#define maxx 510
int edges[maxx][maxx];
int num_pts[maxx];

int Recalls[maxx * maxx + 100];
int tails = 0;

void Finds(int s)
{
    if(num_pts[s] == 0){
        Recalls[++tails] = s;
        return;
    }
    for(int i = 1; i <= N; i++)
        if(edges[i][s] > 0){
            edges[i][s]--;  edges[s][i]--;
            num_pts[s]--;   num_pts[i]--;
            Finds(i);
            if(num_pts[s] == 0){
                Recalls[++tails] = s;
                return;
            }
        }
    if(num_pts[s] == 0)
        Recalls[++tails] = s;
}

void Gotos()
{
    int Q[3] = {0, 140000, 150000};
    int p = 0;
    for(int i = 1; i <= N; i++)
        if(num_pts[i] % 2 == 1)
            Q[++p] = i;
    if(p != 0)
        Finds(min(Q[1], Q[2]));
    else
        Finds(1);
}

int main()
{
    cin >> F;
    int a, b;
    memset(edges, 0, sizeof(edges));
    memset(num_pts, 0, sizeof(num_pts));
    for(int i = 1; i <= F; i++){
        cin >> a >> b;
        N = max(a, N);  N = max(b, N);
        edges[a][b]++;  edges[b][a]++;
        num_pts[a]++;   num_pts[b]++;
    }
    Gotos();
    for(int i = tails; i >= 1; i--)
        cout << Recalls[i] << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值