糯米

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

POJ 2457 Part Acquisition 宽搜

用邻接表存边,需要记录路径。


#include <stdio.h>

#define MAX_N 50032
#define MAX_K 1024

struct queue_node {
    
int step, idx;
    
struct queue_node *prev;
}
;
struct queue_node queue[MAX_K];

struct edge_node {
    
int idx;
    
struct edge_node *next;
}
;
struct edge_node edges[MAX_N], *map[MAX_K];

int qh, qt, N, K, visited[MAX_K], path[MAX_K];

__inline 
int push(int idx, int step, struct queue_node *prev)
{
    
if (visited[idx])
        
return 0;
    visited[idx]
++;
    queue[qt].idx 
= idx;
    queue[qt].step 
= step;
    queue[qt].prev 
= prev;
    qt
++;
    
return idx == K;
}


int main()
{
    
int i, a, b;
    
struct queue_node *t;
    
struct edge_node *e;

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

    scanf(
"%d%d"&N, &K);
    
for (i = 0; i < N; i++{
        scanf(
"%d%d"&a, &b);
        edges[i].idx 
= b;
        edges[i].next 
= map[a];
        map[a] 
= &edges[i];
    }


    push(
11, NULL);
    
while (qh != qt) {
        t 
= &queue[qh++];
        
for (e = map[t->idx]; e; e = e->next) 
            
if (push(e->idx, t->step + 1, t))
                
break;
        
if (e)
            
break;
    }


    
if (qh == qt) {
        printf(
"-1\n");
        
return 0;
    }


    t 
= &queue[--qt];
    printf(
"%d\n", t->step);
    
for (i = 0; t; t = t->prev) 
        path[i
++= t->idx;
    
for (i--; i >= 0; i--)
        printf(
"%d\n", path[i]);

    
return 0;
}


posted on 2010-03-31 17:14 糯米 阅读(334) 评论(0)  编辑 收藏 引用 所属分类: POJ


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