CF547D Mike and Fish(图论建模)
题意
二维平面上有
分析
方法一:上下界网络流
对所有行和列建点,
方法二:欧拉回路
可能是一个经典套路。套路性的建行点列点,
方法三:二分图染色
我认为非常优美的思路,我想不到。
将一行内的点两两配对,剩下一个点不管。列同理。
可以证明该图为二分图。
感性证明:根据建模,一个点只会跟至多一个与它同横坐标的点和至多一个与它同纵坐标的点连边。假设有点
,由于 已经跟一个横坐标与其相同的点连过边了,那么另一条出边必然和其纵坐标相同,以此类推,当走到与 同侧的点时,其与其入点的纵坐标相同,故若形成奇环,那么这个点一定要和 连边。而 的横坐标边已经跟 相连了,这与一行内点两两匹配的建模方式相悖,因此得证。
给出方法三代码,非常好写:
int n;
vector<int>G[maxn];
int lstx[maxn],lsty[maxn];
int col[maxn];
void dfs(int x,int c){
col[x]=c;
for(int u:G[x])if(!col[u])dfs(u,-c);
}
inline void solve_the_problem(){
n=rd();
rep(i,1,n){
int x=rd(),y=rd();
if(!lstx[x])lstx[x]=i;
else G[lstx[x]].emplace_back(i),G[i].emplace_back(lstx[x]),lstx[x]=0;
if(!lsty[y])lsty[y]=i;
else G[lsty[y]].emplace_back(i),G[i].emplace_back(lsty[y]),lsty[y]=0;
}
rep(i,1,n)if(!col[i])dfs(i,1);
rep(i,1,n)pc(col[i]==1?'r':'b');
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现