糯米

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

POJ 3256 Cow Picnic 宽搜

思路:

这题刚开始看上去,很屌,真的。
如果用很图论的做法,就很牛逼了。
首先要把环合并为一点,然后就变成了有向无环图,然后可能用拓扑排序之类的手段解决它。
这个很难很难,反正以哥的智商是没可能想出来的。
考虑了一下,只要每头牛为起始点遍历一下图,然后统计每个点上有多少头牛能过经过就行了。
复杂度 O(NK) 还是能过的。所以就瞬间沦为一道水题了。
后来代码写出来,太爽啦 0MS,这题哥的代码是第一!

#include <stdio.h>

#define MAX_N 1024
#define MAX_E 10032

struct edge_node {
    
struct edge_node *next;
    
int b;
}
;

struct vetx_node {
    
struct edge_node *e;
    
int cows, degs;
}
;

struct edge_node edges[MAX_E];
struct vetx_node vetxs[MAX_N];
int K, N, M;
int vis[MAX_N], tm;
int queue[MAX_N], head, tail;

inline 
void push(int i, int d)
{
    
if (vis[i] == tm)
        
return ;
    vis[i] 
= tm;
    vetxs[i].degs 
+= d;
    queue[tail
++= i;
}


inline 
void pop(int *i)
{
    
*= queue[head++];
}


inline 
void bfs(int i)
{
    
int d;
    
struct edge_node *e;

    d 
= vetxs[i].cows;
    tm
++;
    head 
= tail = 0;
    push(i, d);
    
while (head != tail) {
        pop(
&i);
        
for (e = vetxs[i].e; e; e = e->next)
            push(e
->b, d);
    }

}


int main()
{
    
int i, a;

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

    scanf(
"%d%d%d"&K, &N, &M);
    
for (i = 0; i < K; i++{
        scanf(
"%d"&a);
        vetxs[a].cows
++;
    }

    
for (i = 0; i < M; i++{
        scanf(
"%d%d"&a, &edges[i].b);
        edges[i].next 
= vetxs[a].e;
        vetxs[a].e 
= &edges[i];
    }

    
for (i = 1; i <= N; i++)
        
if (vetxs[i].cows)
            bfs(i);
    a 
= 0;
    
for (i = 1; i <= N; i++)
        
if (vetxs[i].degs == K)
            a
++;
    printf(
"%d\n", a);

    
return 0;
}

posted on 2010-04-21 21:49 糯米 阅读(254) 评论(0)  编辑 收藏 引用 所属分类: POJ


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