POJ-3256, TJU-2834:Cow Picnic

keyword

有向グラフ 探索 C++

概要

牛がk(<100)匹いて、それぞれ(n<1000)個の牧草地のどこかにいる。m(<10000)の有向辺が与えられる。このとき、全ての牛が到達できるような牧草地がいくつあるかを求める問題。それぞれの牛について到達可能な点を探索してやればよい。計算量はO(k*m)なので一応間に合う。一回計算したのを再利用とかしたらもっと早くなる、かもしれない。最初は問題を勘違いして2部グラフのマッチングだと思っていた。

int main(){
    bool visited[1002], all[1002];
    int k,n,m,i,j,x,y;
    int st[102];
    scanf("%d%d%d",&k,&n,&m);
    REP(i,1002)all[i]=false;
    REP(i,n) all[i] = true;

    vector< vector<int> > graph(n);
    REP(i,k){
        scanf("%d",&x);
        st[i] = x - 1;
    }
    REP(i,m){
        scanf("%d%d",&x,&y);
        graph[x-1].PB(y-1);
    }

    REP(i,k){
        int cur = st[i];
        REP(j,n) visited[j] = false;
        visited[cur] = true;
        queue<int> Q;
        Q.push(cur);
        while(!Q.empty()){
            cur = Q.front(); Q.pop();
            visited[cur] = true;
            EACH(graph[cur],it)if(!visited[*it]){
                Q.push(*it);
            }
        }
        REP(j,n) if(!visited[j]) all[j] = false;
    }

    printf("%d\n",count(all,all+n,true));
    //printf("%d\n",BipartiteMatchingByList(bigraph));

    return 0;
}