大意:在一个养老院,有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;
}