hdu 2181 dfs+假哈密顿

要求:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。输出所有符合要求的路线。

方法:dfs

#include<iostream>
#include<stdio.h>
#include<queue>
#include<map>
#include<string.h>
#include<math.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std ;
int cnt ;
int m ;
int ans[50] ;
int used[50] ;
int map1[50][50] ;
void output()
{
	int i , j ;	
	printf("%d:  %d " , ++cnt , m) ;
	for(i = 0 ; i < 19 ; i ++)
	    printf("%d " , ans[i]) ;
	printf("%d\n" , m) ;	
}
void dfs(int n , int k)
{
	int i , j ;
	if(k == 19 && map1[n][m])
	{
	   output() ;
	   return ;	
	}
	for(i = 1 ; i <= 20 ; i ++)
	    if(map1[n][i] && !used[i])
	    {
	       used[i] = 1 ;
		   ans[k] = i ;
		   dfs(i , k + 1) ;
		   used[i] = 0 ;	
		}
}
int main()
{
	int i , j , k ;
  	int a , b , c ;
	memset(map1 , 0 , sizeof(map1)) ;
  	for(i = 1 ; i <= 20 ; i ++)
  	{
  		scanf("%d%d%d" , &a , &b , &c) ;
  		map1[i][a] = map1[a][i] = 1 ;
  		map1[i][b] = map1[b][i] = 1 ;
  		map1[i][c] = map1[c][i] = 1 ;
	}
	while(scanf("%d" , &m) && m != 0)
	{
		cnt = 0 ;
		memset(used , 0 , sizeof(used)) ;
		used[m] = 1 ;
		dfs(m , 0) ;
	}
} 

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/85994849