COCI CONTEST #3 29.11.2014 DOM

大意:在一个养老院,有n个老人在看电视。电视有m个频道,编号为1,2,……,m。每个老人都有一个最喜欢的频道和一个最讨厌的频道。如果电视正在放的频道是某个老人最讨厌的,那么他会起身把电视调成自己最喜欢的频道。如果有多个老人都最讨厌那个频道,则最年轻的那个老人会起身去调台,其他老人就不会动。如果换了台以后,当前播放的频道又是某个老人讨厌的,则那个老人又会去把电视换成自己最喜欢的频道。老人们都很固执,他们会不厌其烦的这样做,直到最后的台是大家都不讨厌的为止,或者就那样一直换下去。
输出电视会被换台多少次。如果一直换下去,输出-1.

思路:其实就是暴力找循环节。

#include<cstdio>
#define MAXN 1000006
int n, m, p;
int l[MAXN], d[MAXN];
int w[MAXN];
bool vis[MAXN];
int main()
{
    scanf("%d%d%d", &n, &m, &p);
    for(int i = 1; i <= n; i ++)
    {
        scanf("%d%d", &l[i], &d[i]);
        if(!w[d[i]]) w[d[i]] = i;
    }
    int t = w[p], cnt = 0;
    if(t == 0)
    {
        printf("%d\n", 0);
        return 0;
    }
    while(!vis[t])
    {
        cnt ++;
        vis[t] = 1;
        p = l[t];
        t = w[l[t]];
        if(t == 0) break;
    }
    if(!vis[t]) printf("%d\n", cnt);
    else printf("-1\n");
    return 0;
}

你可能感兴趣的:(COCI CONTEST #3 29.11.2014 DOM)