C题(小白114赛)小题解C++11
题意:N个英雄,血量无敌,打了一下K号英雄1点血量。每一个人都选了一个替身,如果替身被攻击,那么本体就会被攻击。
题解:
样例1给的很明白,我们假设3是2的替身,2是1的替身,1是3的替身,打了一下3,那么就会形成:
打一下3->3是2的替身->2被扣血->2是1的替身->1被扣血->1是3的替身->3被扣血
|_>->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->|
并陷入死循环,因此他们血量再大,也熬不住c=♾️ while(1) c--。
得出结论:
如果替身和本体建一条边,沿着边遍历最终可以回到原来的顶点(形成闭环),那么答案就是Yes,反之就是No。
参考代码:
//如果构成闭环则输出Yes//
#include<bits/stdc++.h>
using namespace std;
bool visited[100005],ans=false;
vector<int> first[100005];
int cnt[100005];
void dfs(int u)
{
int i;
if(visited[u])//遍历到初始顶点//
{
ans=true;
return;
}
visited[u]=true;
for(i=0;i<cnt[u];++i)
dfs(first[u][i]);
}
int main()
{
int n,x,i,ba;
scanf("%d %d",&n,&x);
for(i=1;i<=n;++i)
{
scanf("%d",&ba);
first[ba].push_back(i);//替身->本体//
cnt[ba]++;
}
dfs(x);
if(ans)
printf("Yes");
else
printf("No");
return 0;
}
有错请指出,会改的