poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))

The Settlers of Catan

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 1123   Accepted: 732

Description

Within Settlers of Catan, the 1995 German game of the year, players attempt to dominate an island by building roads, settlements and cities across its uncharted wilderness.
You are employed by a software company that just has decided to
develop a computer version of this game, and you are chosen to implement
one of the game‘s special rules:

When the game ends, the player who built the longest road gains two extra victory points.

The problem here is that the players usually build complex road
networks and not just one linear path. Therefore, determining the
longest road is not trivial (although human players usually see it
immediately).

Compared to the original game, we will solve a simplified problem
here: You are given a set of nodes (cities) and a set of edges (road
segments) of length 1 connecting the nodes.

The longest road is defined as the longest path within the network
that doesn‘t use an edge twice. Nodes may be visited more than once,
though.

Example: The following network contains a road of length 12.

o      o--o      o
 \    /    \    /
  o--o      o--o
 /    \    /    o      o--o      o--o
           \    /
            o--o

Input

The input will contain one or more test cases.
The first line of each test case contains two integers: the number
of nodes n (2<=n<=25) and the number of edges m (1<=m<=25).
The next m lines describe the m edges. Each edge is given by the numbers
of the two nodes connected by it. Nodes are numbered from 0 to n-1.
Edges are undirected. Nodes have degrees of three or less. The network
is not neccessarily connected.

Input will be terminated by two values of 0 for n and m.

Output

For each test case, print the length of the longest road on a single line.

Sample Input

3 2
0 1
1 2
15 16
0 2
1 2
2 3
3 4
3 5
4 6
5 7
6 8
7 8
7 9
8 10
9 11
10 12
11 12
10 13
12 14
0 0

Sample Output

2
12
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

int map[30][30];
bool vis[30][30];
int n, m;
int MAX;

void dfs(int dd, int num )
{
	for(int i=0; i<n; i++)
	{
		if(map[dd][i]==1 && vis[dd][i]==0 )
		{
			vis[dd][i]=1; vis[i][dd]=1;
			dfs(i, num+1);
			vis[dd][i]=0; vis[i][dd]=0;
		}
	}
	if(num>MAX) MAX=num;
}

int main()
{
	int i, j;
	int u, v;
	while(scanf("%d %d", &n, &m)!=EOF)
	{
		if(n==0 && m==0 )break;
		memset(map, 0, sizeof(map ));

		for(i=0; i<m; i++)
		{
			scanf("%d %d", &u, &v);
			map[u][v]=1; map[v][u]=1;
		}
		MAX=-1;
        int cnt;
		for(i=0; i<n; i++)
		{
		    cnt=0;
			memset(vis, false, sizeof(vis));
			dfs(i, 0);
			//if(cnt>MAX) MAX=cnt;
		}
		printf("%d\n", MAX );
	}
	return 0;
}
				
时间: 2025-01-13 21:29:40

poj The Settlers of Catan( 求图中的最长路 小数据量 暴力dfs搜索(递归回溯))的相关文章

poj 3895 Cycles of Lanes 修改tarjan算法求图中最大环

题意: 给一个边权均为1的无向图,求图中的最大环. 分析: tarjan算法一般用来强连通分量,它依次访问图中的各个强连通分量,这题要求最大环,而环也是强连通分量的一部分,所以可以在每个点访问其他点时修改时间戳,达到每个环上时间戳连续的目的,这样当访问到一个栈中节点时就能直接更新最大环了.根据同样的思路,即使边权任意,也可求最大环或最小环. 代码: //poj 3895 //sep9 #include <iostream> #include <vector> #include &l

Floyd-Warshall求图中任意两点的最短路径

原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短路径(前提是存在此路径): 2:A先通过其他点,再由其他点到B. 我们并不知道A是否需要通过其他点间接到达B,所以只能比较,用A到B的直接路径和A先通过其他点 再间接到达B的路径长度进行比较,然后更新为较小值. 上图中若要求顶点4到顶点3的最短路径,可以比较顶点4直接到3的路径和顶点4先到1,再到3

求字符串中的最长回文子串

题目:给定一个字符串S,求其中的最长的回文子串! 思路:采用动态规划的思想 /** * author :wxg */ #include<iostream> #include<string> using namespace std; /*** 动态规划的思想:字符串 S,以及 f(i,j)表示子字符串 S[i,j] 是否为回文,如果是,f(i,j)=true,否则为 false: ----- true ,i == j f (i, j) = ---- S[i] = S[j] ,j ==

HDU 3249 Test for job (有向无环图上的最长路,DP)

 解题思路: 求有向无环图上的最长路,简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define LL long long using namespace std; const int

在Google Map中使用地址获取坐标(适用小数据量)

近期手上有个95条数据的地址信息,想把地址转换成经纬度坐标,叠加在底图上.ESRI的online作为专业的云平台,号称提供地理编码服务,可能使用自己的数据制作Web map,于是转成CSV后试了下,结果只有4条记录转换成坐标了,并且都偏离了一个省的范围,基本上不可用.后来想在google earth上试下,使用地址搜索,也不知道是服务器慢,还是什么其他原因,earth的搜索功能简直处于瘫痪状态,打一个地址,10分钟能反应过来,结果基本上是找不到.无奈之下,又试了试google Map,Map上是

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制:小数据池和代码块 Python 中的驻留机制主要有两个:小数据池和代码块.驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面: 解决日后写代码过程中可能出现的疑惑.在后期开发中,能 明确 知道有些代码为什么不能正常使用 找工作面试时或多或少可能被问到,关键时刻起到装 X 的作用 先补充一个关键字 is.is(是) 和 ==(等于) 的作用十分相似,我们在这里将它们进行一个对比: == : 官方:判断等号两边的内容是否相同 白话

求图中某点到另一点的通路

图的搜索方法有DFS和BFS,但是这两个算法不能直接得到(其实是我不会)图中任意一点到另外一点的通路路径,以图中某个点作为起点,另外一点作为终点,从终点开始,利用邻接表,从后向前查找,首先查找可以直接到终点的节点,放入集合S1中,然后再查找可以直接到S1的节点,存入集合S2,只到找到起点为止.代码如下: 1 public static void getReachableNodeCollection(){ 2 ArrayList<ArrayList<Integer>> reachab

求水洼的问题(或者是说求图中连通子图的个数)----深度优先算法

遇到这个题的时候,不太容易快速的想到思路:可能会比较容易想到使用递归的思想:但是具体怎么写呢?其实这个题就相当于是图论中的求连通图,很容易应该想到的是深度优先搜索或者是广度优先搜索:我们就用深度优先算法来求这个题目:直接求有几个区域不好求,那么我们换个思路来求,这种题就是这样,直接求不好求,但是当我们转换一下思路之后就豁然开朗: 我们遍历所有的点,当遇到有水的点时,就将它周围的(八个方向)所有的水点都消除:所以在主遍历for循环中遇到几个水点就是有几个水洼: /*****************

POJ 3258 River Hopscotch(二分求最小中的最大)

Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement takes place on a long, straight river with a rock at the start and another rock at th