现在的位置: 首页 > 综合 > 正文

poj 3256 Cow Picnic (dfs)

2013年06月24日 ⁄ 综合 ⁄ 共 1179字 ⁄ 字号 评论关闭

http://poj.org/problem?id=3256

对N个牧场用邻接表存储路径,记录下每个牧场初始牛的数目,沿路径dfs求连通牧场的牛数和。

code:

#include<cstdio>
#include<cstring>
using namespace std ;
int num[1001] ;
int sum[1001] ;
int head[1001] ;
bool vis[1001] ;
int x ;
struct past{
    int v, nex ;
}edge[10001] ;
void addedge(int u, int v){
    edge[x].v = v ;
    edge[x].nex = head[u] ;
    head[u] = x ;
    x ++ ;
}
void dfs(int a, int b){
    for(int i=head[a]; i; i=edge[i].nex){
        if(vis[edge[i].v])  continue ;
        vis[edge[i].v] = true ;
        sum[edge[i].v] += b ;
        dfs(edge[i].v, b) ;
    }
}
int main(){
    int n, m, k, i, u, v, ans ;
    while(~scanf("%d%d%d", &k, &n, &m)){
        memset(num, 0sizeof(num)) ;
        memset(sum, 0sizeof(sum)) ;
        for(i=0; i<k; i++){
            scanf("%d", &u) ;
            num[u] ++ ;
        }
        for(i=0; i<m; i++){
            scanf("%d%d", &u, &v) ;
            addedge(u, v) ;
        }
        for(i=1; i<=n; i++){
            memset(vis, falsesizeof(vis)) ;
            sum[i] += num[i] ;
            vis[i] = true ;
            dfs(i, num[i]) ;
        }
        ans = 0 ;
        for(i=1; i<=n; i++)
            if(sum[i]==k)   ans ++ ;
        printf("%d\n", ans) ;
    }
    return 0 ;} 

抱歉!评论已关闭.