POJ 2197 Jill's Tour Paths (DFS)

题意:给定n个城市及其之间的距离,以及距离限制limit 初始点start 结束点end,要求求出从start->end的所有不大于limit的路径并输出,而且是按字典序输出。

思路:很明显DFS+记录路径,由于要求字典序输出,那么建立前向星表的时候就要注意了,搜索子节点的顺序一定是从小到大的!另外就是输出格式上注意一下,格式很huang很baoli!

  
    
#include < iostream >
#include
< cstdio >
#include
< algorithm >
#include
< memory.h >
#include
< cmath >
#include
< bitset >
#include
< queue >
#include
< vector >
using namespace std;

const int BORDER = ( 1 << 20 ) - 1 ;
const int MAXSIZE = 37 ;
const int MAXN = 30 ;
const int INF = 0x4ffffff ;

#define CLR(x,y) memset(x,y,sizeof(x))
#define ADD(x) x=((x+1)&BORDER)
#define IN(x) scanf("%d",&x)
#define OUT(x) printf("%d\n",x)
#define MIN(m,v) (m)<(v)?(m):(v)
#define MAX(m,v) (m)>(v)?(m):(v)
#define ABS(x) ((x)>0?(x):-(x))

int n,m,ans;
int start,end,limit;
int index,net[MAXN];
int g[MAXN][MAXN];
bool visit[MAXN];
int route[MAXN];
int deep;
int case_id;

typedef
struct {
int v,val,next;
}EDGE;
typedef
struct {
int len,num;
int city[MAXN];
}NODE;
EDGE edge[MAXN
* MAXN];
NODE node[MAXN
* MAXN * MAXN * MAXN];

int init()
{
CLR(net,
- 1 );
CLR(visit,
0 );
CLR(g,
0 );
index
= 0 ;
ans
= 0 ;
deep
= 0 ;
return 0 ;
}
void add_edge( const int & u, const int & v, const int & val)
{
edge[index].next
= net[u];
edge[index].v
= v;
edge[index].val
= val;
net[u]
= index;
++ index;
}
bool cmp( const NODE & a, const NODE & b)
{
return a.len < b.len;
}
/*
{
if(a.len != b.len)
return a.len < b.len;
int t = MAX(a.num,b.num);
for(int i = 1; i <= t; ++i)
if(a.city[i] != b.city[i])
return a.city[i] < b.city[i];
return true;
}
*/
int input()
{
int i,j,tmp;
int a,b;
scanf(
" %d " , & m);
for (i = 1 ; i <= m; ++ i)
{
scanf(
" %d%d%d " , & a, & b, & tmp);
g[a][b]
= g[b][a] = tmp;
}
scanf(
" %d%d " , & start, & end);
scanf(
" %d " , & limit);
return 0 ;
}
int make_graph()
{
int i,j,tmp;
for (i = 1 ; i <= n; ++ i)
for (j = n; j >= 1 ; -- j)
if (g[i][j])
add_edge(i,j,g[i][j]);
return 0 ;
}
void dfs( const int & u, const int & dist)
{
if (dist > limit)
return ;
route[deep]
= u;
++ deep;
if (u == end)
{
memcpy(node[ans].city,route,deep
* sizeof (route[ 0 ]));
node[ans].len
= dist;
node[ans].num
= deep;
++ ans;
-- deep;
return ;
}
for ( int i = net[u] ; i != - 1 ; i = edge[i].next)
if ( ! visit[edge[i].v])
{
visit[edge[i].v]
= true ;
dfs(edge[i].v,dist
+ edge[i].val);
visit[edge[i].v]
= false ;
}
-- deep;
}
int output()
{
int i,j,tmp;
printf(
" Case %d:\n " ,case_id);
if (ans == 0 )
{
printf(
" NO ACCEPTABLE TOURS\n\n " );
return 0 ;
}
for (i = 0 ; i < ans; ++ i)
{
printf(
" %d: " ,node[i].len);
for (j = 0 ; j < node[i].num; ++ j)
printf(
" %d " ,node[i].city[j]);
printf(
" \n " );
}
printf(
" \n " );
return 0 ;
}
int work()
{
make_graph();
visit[start]
= true ;
dfs(start,
0 );
sort(node,node
+ ans,cmp);
return 0 ;
}
int main()
{
case_id
= 1 ;
while (scanf( " %d " , & n) != EOF)
{
if (n == - 1 )
break ;
init();
input();
work();
output();
++ case_id;
}
return 0 ;
}

 

你可能感兴趣的:(Path)