题解 P6264 【[COCI2014/2015#3]DOM】
对于这道题,我们可以建图解决问题。
在这题所构造的图中,如果点
样例 3 建的图差不多是这样子的:
我们可以试着再把图化简一下:
每次要调整频道时,只会让最年轻的人来调整,所以对于每个点,只要保留它第一次连的边就行了。
可以发现,当走到入度为 0 的结点时,就没有人会调频道了,可以输出答案。而且,当两次都经过同一个点时,就表示老人们会一直循环调整频道,输出 -1 结束程序即可。
代码如下:
#include<bits/stdc++.h>
#define Maxn int(1e5)
using namespace std;
int n,m,now,ans;//now:目前所在的结点
int nxt[Maxn+5];//nxt[x]表示x连接的那一条边
int vis[Maxn+5];//vis[x]记录x结点经过了几次
int main()
{
scanf("%d%d%d",&n,&m,&now);
for(register int i=1;i<=n;++i)
{
int a,b;
scanf("%d%d",&a,&b);
if(!nxt[b]) nxt[b]=a;//连边
}
while(nxt[now])
{
if(++vis[now]>1)//特判无解
{
printf("-1");
return 0;
}
now=nxt[now];
++ans;
}
printf("%d",ans);
return 0;
}