嘘つきな天使たち AtCoder
根据题意可知,如果第 \(i\) 只生物是天使那么 \(a_i\) 生物就是恶魔,如果第 \(i\) 只生物是恶魔那么 \(a_i\) 生物就是天使,这时我们就发现这与二分图染色法相同,关于二分图染色法可以看这里。
样例一如下图:
因为这题要求出恶魔数量最多的方案,所以每次选择颜色最多的那个颜色加到答案上。
注意:图不连通,输出答案要换行。
比较详细的代码:
#include <bits/stdc++.h> using namespace std; int n,m; int color[200005]; int vis[200005]; int p=0; int x,y; vector<int> v[200005]; void dfs(int k,int fa){ if(color[fa]==1){//与上一个点的颜色相反 color[k]=0; y++; } else if(color[fa]==0){ color[k]=1; x++; } vis[k]=1;//染过了 for(int i=0;i<v[k].size();i++){//遍历出边 int yy= v[k][i]; if(color[yy]==color[k]){//颜色相同,不合法 p=1; return ; } else{ if(vis[yy]==0){//没遍历过 dfs(yy,k);//遍历 } } } return; } int main(){ ios::sync_with_stdio(false); memset(color,-1,sizeof color);//都没颜色 cin>>n; for(int i=1;i<=n;i++){ int vv; cin>>vv; v[i].push_back(vv);//连边 } int sum=0; color[0]=1; for(int i=1;i<=n;i++){ if(vis[i]==0){//没染过色 x=0;//此连通块中颜色1的点数 y=0;//颜色0的点数 dfs(i,0); sum+=max(x,y);//取最多的方案 } } if(p==0){ cout<<sum<<"\n";//注意换行 } else{ cout<<"-1\n"; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」