zjnu MAFIJA (图论)

来源:互联网 发布:华讯网络好吗 编辑:程序博客网 时间:2024/05/29 03:20

题意:

就是有n个人在玩杀人游戏,每个杀手相互知道,现在每个人要指认杀手,杀手不能指认杀手,平民可以指认杀手和平民。问你做多有多少个杀手。


思路:

这是个染色问题,把没有指认过的的人开做杀手,在遍历一下图就好了

AC代码“

/* ***********************************************Author        :yzkAcceptedCreated Time  :2016/3/18 19:24:59TASK  :。.cppLANG          :C++************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;typedef __int64 ll;const int maxn=500010;int s[maxn],dig[maxn];int vis[maxn];int n,tot,ans;void dfs(int u,int c){if(vis[u]==1) return;vis[u]=1;dig[s[u]]--;ans+=c;if(dig[s[u]]==0||c==1)dfs(s[u],c^1);}int main(){int i,j,k;    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);scanf("%d",&n);memset(vis,0,sizeof(vis));ans=0;for(i=1;i<=n;i++){scanf("%d",&s[i]);dig[s[i]]++;}for(i=1;i<=n;i++){if(dig[i]==0)dfs(i,1);}for(i=1;i<=n;i++){dfs(i,0);}cout<<ans<<endl;    return 0;}


0 0
原创粉丝点击