当前位置: 首页 > news >正文

SP2878 KNIGHTS - Knights of the Round Table 题解

对于原图上的仇恨关系,我们可以重新建边,新的边表示两个人可以相邻。一次会议当中所有合法的点一定来源于一个点双联通分量,因为如果有两个点不在同一个双联通分量的话,因为两个点双联通分量之间最多只有一条边连接,那么这样的会议一定会面临两个点中有一个点不能和会议当中其他的点相邻。

接下来我们思考如何在同一个双联通分量内部计算出合法的点对数量,首先奇环上面的点一定是符合定义的,如果不在奇环上面的点呢?对于一个点双联通分量内部的点而言,因为一个奇环可以拆分成一条奇数长度的链和一条偶数长度的链,所以说经过所有点联通分量内部点的那条环路一定可以通过选择走奇链还是偶链形成一个新的奇环。所以说只要一个点双联通分量内部是存在奇环的,那么所有的点都一定存在一个奇环上面,找奇环可以用染色法。我们只需要记录出每一个双联通分量,然后找奇环就可以。

代码

#include <bits/stdc++.h>
using namespace std;const int N=1e3+5;int mp[N][N];
int n,m;int dfn[N],low[N],idx;
vector<vector<int>> bcc;
stack<int> stk;
bool flag[N],vis[N],is[N];
int number[N];void Tarjan(int u,int fa){dfn[u]=low[u]=++idx;stk.push(u);for(int v=1;v<=n;v++){if(!mp[u][v]||v==fa) continue; if(!dfn[v]){Tarjan(v,u);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){int x;vector<int> res;res.push_back(u);do{x=stk.top();stk.pop();res.push_back(x);}while(x^v);bcc.push_back(res);}}else low[u]=min(low[u],dfn[v]);}
}void sol(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){mp[i][j]=0;}flag[i]=vis[i]=is[i]=false;dfn[i]=low[i]=number[i]=0;}idx=0;if(bcc.size()) bcc.clear();for(int i=0;i<m;i++){int u,v;cin>>u>>v;mp[u][v]=mp[v][u]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) mp[i][j]=0;else mp[i][j]^=1;}}for(int i=1;i<=n;i++){if(!dfn[i]) Tarjan(i,i);}auto dfs=[&](auto &&self,int u,int x,int cnt)->bool{vis[u]=1;number[u]=x;for(int v:bcc[cnt]){if(mp[u][v]==0) continue;if(vis[v]){if(number[v]==x) return false;    }else if(!self(self,v,x^1,cnt)) return false;}return true;};// for(int i=0;i<bcc.size();i++){//     cout<<i<<'\n';//     for(int j=0;j<bcc[i].size();j++){//         cout<<bcc[i][j]<<" ";//     }//     cout<<'\n';// }int ans=0;for(int i=0;i<bcc.size();i++){bool f=dfs(dfs,bcc[i][0],0,i);for(int j=0;j<bcc[i].size();j++){if(!f)   is[bcc[i][j]]=true;vis[bcc[i][j]]=false;}}for(int i=1;i<=n;i++) if(!is[i]) ans++; cout<<ans<<'\n';
}int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);while(1){cin>>n>>m;if((n|m)==0) return 0;sol();}
}
http://www.jsqmd.com/news/476954/

相关文章:

  • Qwen3-Reranker-0.6B效果展示:RAG检索精排前后对比图+真实得分可视化
  • pydata-book示例代码库:100+个数据分析实用代码片段
  • 2026年职业院校技能大赛中职移动应用与开发模块二智慧党建系统零基础培训视频(全套)
  • 【Physics】1. Two Blocks and a Pulley、Sliding Off a Sphere
  • RMBG-2.0镜像免配置教程:Docker一键拉取+开箱即用抠图终端
  • 那些被遗忘的卡券价值,中银通支付卡回收隐藏的秘密 - 京顺回收
  • 大模型落地指南:小白程序员必看,收藏这份从入门到实战的学习资料!
  • Bambu Lab 3D打印机怎么选?2026年实用评测与建议,国内Bambu Lab 3D打印机10年质保有保障 - 品牌推荐师
  • ProcessHacker内存分析功能详解:定位恶意进程的关键技巧
  • Stanford Alpaca评估指标详解:ROUGE分数与指令跟随能力评测
  • 为什么选择HackerGPT-2.0?探索伦理黑客AI的独特优势与应用场景
  • 【Physics】2. Loop in a Decaying Field、Falling Chain onto a Scale
  • InstructPix2Pix效果验证:第三方评估机构结构保真度评分4.8/5.0
  • Guanaco模型家族横空出世:QLoRA训练的聊天机器人性能超越Vicuna
  • ant-design-vue完全指南:Vue开发者必备的UI组件库入门教程
  • RAG保姆级教程:大模型知识库构建与优化,建议收藏
  • SiameseUIE开源模型教程:GPU算力适配不同显存(8G/16G/24G)方案
  • LabelMe标注结果统计分析:类别分布与质量报告生成
  • LabelMe单元测试编写指南:确保标注工具稳定性
  • 10分钟上手Moonlight-Qt:新手必备的游戏串流配置清单
  • YOLOv3实例分割实战:从标注到部署的完整工作流
  • OCRmyPDF源码解析:核心模块_pipeline.py的工作流程
  • Solarized节能模式:降低屏幕亮度的终极色彩策略
  • Botpress:打造企业级GPT/LLM智能体的终极开源平台
  • mmdetection目标检测API详解:推理接口使用指南
  • OCRmyPDF核心功能揭秘:多语言支持与PDF/A输出的完美结合
  • Solarized色彩方案导出:从GIMP到Photoshop的调色板转换
  • Agentic与Vercel AI SDK集成:打造下一代AI应用
  • 告别复杂配置!Windows/Linux/MacOS全平台部署Chinese-LLaMA-Alpaca教程
  • Stanford Alpaca数据生成伦理问题:AI辅助创作的边界探讨