POJ 2230 Watchcow 深搜

POJ 2230 Watchcow 深搜

思路:

深搜的时候,可以生成一棵树。
深搜也就是深度遍历这棵树,把遍历的路径打印出来,就解决了一部分边了,这部分边都是经过两次的,来一次去一次。
剩下的边,就是遍历的时候正在访问的节点与已经访问的节点之间的边,很容易的判断的。同样把这部分路径也打印出来。
后来看了 Discuss 才发现,这个东西叫做“欧拉回路”,又长见识了。

代码
#include  < stdio.h >

#define  MAX_M 50032
#define  MAX_N 10032

int  N, M;

struct  edge_node  {
    
int vis, to;
    
struct edge_node *next;
}
;
struct  edge_node edges[MAX_M  *   2 ],  * map[MAX_N];
int  edges_cnt, vis[MAX_N];

inline 
void  insert( struct  edge_node  * e,  int  from,  int  to)
{
    e
->to = to;
    e
->next = map[from];
    map[from] 
= e;
}


void  dfs( int  idx)
{
    
struct edge_node *e;
    
int i;

    vis[idx] 
= 1;
    printf(
"%d\n", idx);

    
for (e = map[idx]; e; e = e->next) {
        i 
= e - edges;
        
if (vis[e->to]) {
            
if (e->vis)
                
continue;
            edges[i].vis 
= 1;
            edges[i 
^ 1].vis = 1;
            printf(
"%d\n%d\n", e->to, idx);
            
continue;
        }

        edges[i].vis 
= 1;
        edges[i 
^ 1].vis = 1;
        dfs(e
->to);
        printf(
"%d\n", idx);
    }

}


int  main()
{
    
int from, to, i;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d"&N, &M);
    
for (i = 0; i < M*2; i += 2{
        scanf(
"%d%d"&from, &to);
        insert(
&edges[i], from, to);
        insert(
&edges[i + 1], to, from);
    }

    dfs(
1);

    
return 0;
}

你可能感兴趣的:(POJ 2230 Watchcow 深搜)