专栏文章
题解:AT_maximum_cup_2018_c 嘘つきな天使たち
AT_maximum_cup_2018_c题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miq0gti7
- 此快照首次捕获于
- 2025/12/03 20:56 3 个月前
- 此快照最后确认于
- 2025/12/03 20:56 3 个月前
二分图一遍就好了。
根据题意可知, 和 是矛盾关系。如果第 只生物是天使,那么 生物就是恶魔;如果第 只生物是恶魔,那么 生物就是天使,用二分图染色。
因为这题图不连通,要求出恶魔数量最多的方案,所以每个连通块选择颜色最多的那个颜色加到答案上。
输出切记换行。注意建双向边,空间开两倍。
CPP根据题意可知, 和 是矛盾关系。如果第 只生物是天使,那么 生物就是恶魔;如果第 只生物是恶魔,那么 生物就是天使,用二分图染色。
因为这题图不连通,要求出恶魔数量最多的方案,所以每个连通块选择颜色最多的那个颜色加到答案上。
输出切记换行。注意建双向边,空间开两倍。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1,M=4e5+1;
int n,v,cnt,ans,cnt1,cnt2,head[N],a[N];//a数组用于染色
struct node{
int to;
int ne;
}tu[M];
void add(int x,int y){
tu[++cnt].to=y;
tu[cnt].ne=head[x];
head[x]=cnt;
return;
}
void dfs(int now,int colour){
for(int i=head[now];i;i=tu[i].ne){
if(a[tu[i].to]==0){
if(-colour==1)
cnt1++;
else
cnt2++;
a[tu[i].to]=-colour;
dfs(tu[i].to,-colour);
}
else if(a[tu[i].to]==-colour){
continue;
}
else{
puts("-1");
exit(0);
}
}
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&v);
add(i,v);
add(v,i);
}
for(int i=1;i<=n;i++){
if(!a[i]){
a[i]=1;
cnt1=1;
cnt2=0;
dfs(i,1);
ans+=max(cnt1,cnt2);
}
}
printf("%d",ans);
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...