深搜解Riding the Fences

Riding the Fences

Farmer John owns a large number of fences that must be repairedannually. He traverses the fences by riding a horse along each andevery one of them (and nowhere else) and fixing the broken parts.

Farmer John is as lazy as the next farmer and hates to ride the samefence twice. Your program must read in a description of a network offences and tell Farmer John a path to traverse each fence length exactlyonce, if possible. Farmer J can, if he wishes,
start and finish at anyfence intersection.

Every fence connects two fence intersections, which are numberedinclusively from 1 through 500 (though some farms have far fewer than500 intersections). Any number of fences (>=1) can meet at a fenceintersection. It is always possible to ride from any fence
to any otherfence (i.e., all fences are "connected").

Your program must output the path of intersections that, if interpretedas a base 500 number, would have the smallest magnitude.

There will always be at least one solution for each set of inputdata supplied to your program for testing.

PROGRAM NAME: fence

INPUT FORMAT

Line 1: The number of fences, F (1 <= F <= 1024)
Line 2..F+1: A pair of integers (1 <= i,j <=500) that tell which pair of intersections this fence connects.

SAMPLE INPUT (file fence.in)

9
1 2
2 3
3 4
4 2
4 5
2 5
5 6
5 7
4 6

OUTPUT FORMAT

The output consists of F+1 lines, each containing a single integer.Print the number of the starting intersection on the first line, thenext intersection‘s number on the next line, and so on, until the finalintersection on the last line. There might be many
possible answers toany given input set, but only one is ordered correctly.

SAMPLE OUTPUT (file fence.out)

1
2
3
4
2
5
4
6
5
7

解决方案

找出起始点,然后用从起始点开始用深搜寻找欧拉路径,唯一需要注意的是两个点之间可能有多条边连接。

运行结果

Executing...
   Test 1: TEST OK [0.003 secs, 4480 KB]
   Test 2: TEST OK [0.003 secs, 4480 KB]
   Test 3: TEST OK [0.005 secs, 4480 KB]
   Test 4: TEST OK [0.003 secs, 4480 KB]
   Test 5: TEST OK [0.005 secs, 4480 KB]
   Test 6: TEST OK [0.008 secs, 4480 KB]
   Test 7: TEST OK [0.011 secs, 4480 KB]
   Test 8: TEST OK [0.014 secs, 4480 KB]

All tests OK.

通过代码

/*
ID: c1033311
LANG: C++
TASK: fence
*/

#include<stdio.h>
#include<string.h>

#define MAX 501
#define MAXP  1030

int point[MAXP],deg[MAX],G[MAX][MAX];
int n=0;

void euler(int u)
{
	int v;
	for(v=1;v<MAX;++v)
	{
		if(G[u][v])
		{
			G[u][v]--;
			G[v][u]--;
			euler(v);
			point[n++]=v;
		}
	}
}

int main(){
	FILE *fin=fopen("fence.in","r");
	FILE *fout=fopen("fence.out","w");

	int F,i,a,b;
	int start;

	fscanf(fin,"%d",&F);    //输入

	for(i=0;i<F;++i)
	{
		fscanf(fin,"%d%d",&a,&b);
		G[a][b]++;    //两个点之间可能有多条边
		G[b][a]++;
		deg[a]++;
		deg[b]++;
	}

	start=1;
	for(i=1;i<MAX;++i)     //寻找起点
		if(deg[i]%2)
		{
			start=i;
			break;
		}

	euler(start);   //寻找欧拉路径
	point[F]=start;

	for(i=F;i>=0;--i)   //输出
		fprintf(fout,"%d\n",point[i]);

	return 0;
}
 
时间: 2024-11-06 05:30:05

深搜解Riding the Fences的相关文章

NYOJ 10 skiing (深搜和动归)

skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每一个数字代表点的高度.以下是一个样例 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

【深搜加剪枝五】HDU 1010 Tempter of the Bone

Tempter of the BoneTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 64326    Accepted Submission(s): 17567 Problem Description The doggie found a bone in an ancient maze, which fascinated him a l

洛谷P2731 骑马修栅栏 Riding the Fences

P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题目背景Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方.题目描述John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即

2016弱校联盟十一专场10.2---Around the World(深搜+组合数、逆元)

题目链接 https://acm.bnu.edu.cn/v3/problem_show.php?pid=52305 problem  description In ICPCCamp, there are n cities and (n−1) (bidirectional) roads between cities. The i-th road is between the ai-th and bi-th cities. It is guaranteed that cities are conne

回溯深搜与剪枝初步

回溯算法也称试探法,一种系统的搜索问题的解的方法,是暴力搜寻法中的一种.回溯算法的基本思想是:从一条路往前走,能进则进.回溯算法解决问题的一般步骤: 根据问题定义一个解空间,它包含问题的解 利用适于搜索的方法组织解空间 利用深度优先法搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索 回溯法采用试错的思想,它尝试分步的去解决一个问题.在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的

(暴力+深搜)POJ - 2718 Smallest Difference

原题链接: http://poj.org/problem?id=2718 题意: 给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值. 分析: 反正也是刷着玩,果断先交一波全排列枚举的代码,果断TLE,然后开始想正解. 稍微想想,既然要差最小,肯定是两个数各一半.所以只要深搜出所有n/2(n为给定数字的个数)的组合,另外个n-n/2个数就有了. 但是枚举出来后的操作又想了很久,想过很多算法,都不怎么满意,最终用二分解决. 先把n/2和n-n/2全排列

六月二十日 上午(深搜)

1最佳调度问题 题目描述 假设有n个任务由k个可并行工作的机器来完成.完成任务i需要的 时间为ti.试设计一个算法找到出完成这个n个任务的最佳调度,使得完成全部任务的时间最早. 对任意给定的整数n和k,以及完成任务i需要的时间为ti,1<=i<=n.编程计算完成这n个任务的最佳调度. n<=20,k<=8 输入 第1 行有2个正整数n 和k.第2行的n个正整数是完成n 根任务需要的时间. 输出 计算出的完成全部任务的最早时间 样例输入 7 3 2 14 4 16 6 5 3 样例输

洛谷 P2731 骑马修栅栏 Riding the Fences

P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个

dfs深搜

dfs深搜 什么是深搜? 百度百科:按照一定的顺序.规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举) 个人理解:暴力穷举每一种状态 它有什么好处? 容易理解 骗分利器 好写 它有什么弊端? 慢.毕竟是穷举每一种状态 一搜到底.对于递归次数非常多的话,dfs会非常浪费时间,甚至有可能会爆栈 如何实现? 算法流程图如下: #include <iostream> #include <cstdio> void dfs(int