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;

}

有错请指出,会改的

全部评论
多个环,只要是环上的点,都会守护到死 6 ? 2 3 1 5 6 4 (?为 1~6 任意值)
1 回复 分享
发布于 04-12 00:14 广东

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务