糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

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;
}

posted on 2010-04-06 22:55 糯米 阅读(368) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理