P7370
简单图论题目。
这个题建图的思路就是按照巫师递魔杖的顺序建边,因为在前面的是赢家,也就是说后者把魔杖递给前者,所以应建反向边。
显然无论怎么安排决斗顺序,只要这个巫师能够通过任何形式打败 1 号,那这个巫师就可能拿到魔杖,所以我们考虑通过 DFS ,找出从 1 号能否到达其他巫师就可以了。
随后我们就想到,如果一名巫师可以击败 1 号,那么 1 号无论怎么安排,都不可能拿到魔杖(好惨一巫师),所以我们建完边后,只需要考虑是否有 1 号的连边。
如果没有那 1 号有魔杖,其余无魔杖,反之则 1 号无魔杖,其余考虑 DFS 的结果即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int num,ans;
vector<vector<int>> edge;
bool vis[MAXN];
void dfs(int now)
{
for (int i:edge[now])
{
if(vis[i]) continue;//注意这里还要判断是否走过
vis[i]=1;
dfs(i);
}
}
int main()
{
std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n,m;
cin>>n>>m;
edge.resize(n+1);
for (int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
edge[y].push_back(x);//反向建边
}
dfs(1);
if(!edge[1].size())//看1有无边
{
vis[1]=1;
}
for (int i=1;i<=n;i++)
{
cout<<vis[i];
}
return 0;
}