程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 539 - The Settlers of Catan

539 - The Settlers of Catan

編輯:C++入門知識

題目:539 - The Settlers of Catan


題目大意:給出一系列的點和相應的邊,求最長的路徑,路徑是由相連的邊構成的,每個邊最多被用一次。


階梯思路:回溯,每次都從一個點開始dfs,如果發現走過相同的邊,就把長度記錄下來,然後把狀態恢復,走別的路。最後去這些路徑中最長的。注意:每個點都有可能成為最長路徑的起點。


#include
#include

const int N = 25;
int map[N][N], m, n, max, d[N];

void dfs (int o, int path) {
	
	for (int i = 0; i < n; i++) {
		
		if (map[o][i]) {
			
			map[o][i] = map[i][o] = 0;
//			printf("%d\n", path);
			dfs(i, path + 1);
			map[o][i] = map[i][o] = 1;
		}
	
	}
	if (max < path)
		max = path;

}

int main () {

	while (scanf("%d%d", &n, &m), m || n) {

		memset(map, 0, sizeof(map));
		memset(d, 0, sizeof(d));
		int x, y;
		for (int i = 0; i < m; i++ ) {
			
			scanf("%d%d", &x , &y);
			map[x][y] = map[y][x] = 1;
			d[x]++;
			d[y]++;
		}

		max = 0;
//		int count = 0;
		for (int i = 0; i < n; i++) 
//			if (d[i] == 1) {

				dfs(i, 0);
//				count++;
//			}
//		if (!count) 
//			dfs(x, 0);
		printf("%d\n", max);
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved